我想为工作设置一个Haskell堆栈项目的容器化构建。我知道stack --docker build
存在,但我想用docker做这个,所以我的同事不需要先安装stack
。
我目前有一个看起来像这样的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
,这似乎不太理想我还没弄清楚它是否会破坏原生堆栈构建或者像intero这样的东西。
我通常在随附的volumes
文件中放入一个docker-compose.yml
部分,它将.stack-work
目录安装到容器中。然后在ENTRYPOINT
的Dockerfile
中引用的脚本中,使用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镜像没有堆栈设置。
FROM fpco/stack-build:lts-9.14
ADD ./build.sh /bin/
ENTRYPOINT ["build.sh"]
在biuld.sh
上运行堆栈设置。
stack setup --resolver=lts-9.14 --allow-different-user
stack build --allow-different-user
在运行时从主机挂载项目目录和stack_root。
docker run -w /workspace -v ~/myproject:/workspace -v ~/.stack:/root/.stack