2015-06-20 104 views
1

我试图做一个Docker化的Yesod应用程序,并且我已经初始化目录./my-app下的Yesod项目。我Dockerfile如下:Docker + Yesod链接失败

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:latesthaskell:7.10但我仍然结束了相同的错误。我不确定这是否是特定的容器操作系统是Ubuntu的事实。我很乐意听到关于此事的建议。

谢谢!

+1

这看起来不像码头问题。它看起来像你试图使用的两个库提供相同的符号。 – larsks

+0

谢谢larsks。我实际上在没有Dockerfile的情况下在项目本身上运行'cabal build',并且它的构建完美无缺。我没有看到使用Dockerfile时出现的链接错误。 – adilipan

+0

我相当肯定@larsks是对的,cabal只是选择不同版本的库。我建议使用堆栈快照(或堆栈)。 –

回答

1

正如@MichaelSnoyman所言,摆弄堆叠并将yesod-static的cabal文件依赖项更改为== 1.5.0获得了要构建的容器。