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

问题描述 投票:3回答:2

我想为工作设置一个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这样的东西。

haskell haskell-stack
2个回答
0
投票

我通常在随附的volumes文件中放入一个docker-compose.yml部分,它将.stack-work目录安装到容器中。然后在ENTRYPOINTDockerfile中引用的脚本中,使用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镜像没有堆栈设置。

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
© www.soinside.com 2019 - 2024. All rights reserved.