Я пытаюсь сделать приложение Dockerized Yesod, и я инициализировал проект Yesod под каталогом ./my-app
. Мой Dockerfile выглядит следующим образом:Docker + Yesod Linking Failure
FROM haskell:7.8
RUN apt-get update && apt-get install -y libpq5 libpq-dev
RUN cabal update
ADD my-app /opt/my-app
WORKDIR /opt/my-app
RUN cabal sandbox delete
RUN cabal sandbox init
RUN cabal install -j --only-dependencies
RUN cabal build
RUN dist/build/db-import/db-import
EXPOSE 3000
CMD ["dist/build/my-app/my-app", "production", "-p", "3000"]
Когда я на самом деле пойти работать докер, это возможность построить все зависимости, но я получаю сообщение об ошибке компоновщика:
/opt/my-app/.cabal-sandbox/lib/x86_64-linux-ghc-7.8.4/cryptonite-0.3/libHScryptonite-0.3.a(generic.o):(.data+0x0): multiple definition of `gmtab'
/opt/my-app/.cabal-sandbox/lib/x86_64-linux-ghc-7.8.4/cipher-aes-0.2.10/libHScipher-aes-0.2.10.a(aes_generic.o):(.data+0x0): first defined here
collect2: error: ld returned 1 exit status
Я не совсем уверен, что здесь, потому что я пробовал это с haskell:latest
и haskell:7.10
, но я все равно получаю ту же ошибку. Я не уверен, является ли это тот факт, что конкретная контейнерная ОС - Ubuntu или нет. Я хотел бы услышать предложения по этому вопросу.
Спасибо!
Это не похоже на проблему докера. Это похоже на то, что две библиотеки, которые вы пытаетесь использовать, предоставляют один и тот же символ. – larsks
Спасибо larsks. Я фактически запускал 'cabal build' в самом проекте без Dockerfile, и он отлично строится. Я не получаю эту ошибку связи, которую я получаю при использовании Dockerfile. – adilipan
Я довольно уверен, что @larsks прав, а cabal просто выбирает разные версии библиотек. Я бы рекомендовал использовать снимок Stackage (или создать со стек). –