如何在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。
答
我通常会将volumes
部分放在随附的docker-compose.yml
文件中,该文件会将.stack-work
目录挂载到容器中。然后在Dockerfile
的ENTRYPOINT
中引用的脚本中,使用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
如果你想在docker中缓存东西,你需要一个单独的行。 https://github.com/commercialhaskell/stack/issues/694有些接近。 – Reactormonk