如何在Docker容器中运行堆栈构建?

问题描述:

我想为工作建立一个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

我通常会将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 

我的解决方案如下。

构建的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