2017-04-16 165 views
2

我想爲工作建立一個Haskell堆棧項目的容器化版本。我知道stack --docker build存在,但我只想用docker來做這件事,所以我的同事不需要先安裝stack如何在Docker容器中運行堆棧構建?

我現在有一個Dockerfile看起來像:

FROM fpco/stack-build:lts-8.9 
RUN mkdir -p /stack && stack --stack-root /stack setup --resolver lts-8.9 
COPY build.sh/
ENTRYPOINT ["/build.sh"] 

而且正在運行stack爲:

stack build --stack-root=/stack --resolver=lts-8.9 

然而,這具有以下問題:

  • 它重建所有每次依賴關係
  • 它需要--allow-different-users,因爲它似乎被重新使用我的本地.stack-work,這似乎不太理想

我還沒有想出是否會打破本機堆棧版本,或之類的東西關於Interotube。

+0

如果你想在docker中緩存東西,你需要一個單獨的行。 https://github.com/commercialhaskell/stack/issues/694有些接近。 – Reactormonk

回答

0

我通常會將volumes部分放在隨附的docker-compose.yml文件中,該文件會將.stack-work目錄掛載到容器中。然後在DockerfileENTRYPOINT中引用的腳本中,使用stack install而不是stack build

docker-compose.yml文件可能是這個樣子,其中backend文件夾中包含我的本地.stack-work目錄:

version: "2" 
services: 
    backend: 
    build: ./docker-containers/backend 
    tty: true 
    stdin_open: true 
    volumes: 
     - ./backend:/home/dev/backend 
     - ./.local:/root/.local 
0

我的解決方案如下。

構建的Docker鏡像沒有堆棧設置。在biuld.sh

FROM fpco/stack-build:lts-9.14 
ADD ./build.sh /bin/ 
ENTRYPOINT ["build.sh"] 

運行堆棧設置。

stack setup --resolver=lts-9.14 --allow-different-user 
stack build --allow-different-user 

在運行時從主機掛載項目dir和stack_root。

docker run -w /workspace -v ~/myproject:/workspace -v ~/.stack:/root/.stack 
相關問題