2015-06-20 102 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獲得了要構建的容器。