使用 Docker 到 运行 构建过程

Use Docker to run a build process

我正在使用 dockerdocker-compose 来设置构建管道。我有一个用 javascript 编写的前端,需要在使用前构建。后端写在go.

为了使这个组件与我们 docker-compose 设置的其余部分集成,我也想在 docker 图像中进行构建。

这是我想要的流程:

我对 dockerdocker-compose 很陌生,所以我不确定这是否可行,甚至不确定该怎么做。

作为参考,这是我的 docker-compose.yml:

version: '2'
volumes:
  output:
    driver: local

services:
  frontend:
    build: .
    volumes:
      - output:/output
  backend:
    build: ./backend
    depends_on:
      - frontend
    volumes:
      - output:/output

Dockerfile:

FROM node

# create working dir
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ADD package.json /usr/src/app/package.json

# install packages
RUN npm install
COPY . /usr/src/app

# build frontend files and place results in /output 
RUN npm build
RUN cp /usr/src/app/build/* /output

backend/Dockerfile

 FROM go

 # copy and build server
 COPY . /usr/src/backend
 WORKDIR /usr/src/backend
 RUN go build

 # run the server
 ENTRYPOINT ["/usr/src/backend/main"]

这里有问题,但我不知道是什么。似乎构建步骤的输出没有保留在 output 卷中。我该怎么做才能解决这个问题?

您无法在 docker build 期间附加卷。 这样做的原因是 docker build 命令的目标是构建一个镜像,没有别的,它不需要卷,因为 Dockerfile 有 ADD / COPY。

要生成输出,您应该创建一个脚本,该脚本主要执行当前 dockerfile 中的 npm install ; npm build ; cp /usr/src/app/build/* /output,并将此脚本用作 dockerfile 中的入口点/cmd。

我不确定 compose 可以 运行 这个,但无论如何,我发现它更清楚地包含在一个 shell 脚本中,该脚本首先执行前端构建器容器,然后执行后端将输出目录作为卷的容器。