从多级Docker构建中提取文件

从多级Docker构建中提取文件,docker,code-coverage,docker-build,docker-multi-stage-build,Docker,Code Coverage,Docker Build,Docker Multi Stage Build,在多级docker构建中,我执行单元测试,生成覆盖率报告,并在构建阶段构建可执行文件,然后将可执行文件复制到运行阶段: FROM golang:1.13 AS build-env COPY . /build WORKDIR /build # execute tests RUN go test ./... -coverprofile=cover.out # execute build RUN go build -o executable FROM gcr.io/distroless/base:

在多级docker构建中,我执行单元测试,生成覆盖率报告,并在构建阶段构建可执行文件,然后将可执行文件复制到运行阶段:

FROM golang:1.13 AS build-env
COPY . /build
WORKDIR /build

# execute tests
RUN go test ./... -coverprofile=cover.out
# execute build
RUN go build -o executable

FROM gcr.io/distroless/base:latest
COPY --from=build-env /build/executable /executable
ENTRYPOINT ["/executable"]

如何在Jenkins环境中提取
cover.out
以发布覆盖率报告?

您应该使用Docker Compose文件运行测试,以便以非交互方式提取输出,并将构建逻辑与管道的其余部分分离(更不用说它更快)

您应该使用带有绑定挂载到
$PWD
docker compose.yml
。以下是Docker Compose文件中的一个片段,它将输出镜像到主机:

version: '3.7'
services:
  app:
    image: golang:1.13
    command: go test ./... -coverprofile=cover.out
    volumes:
      - type: bind
        source: .
        target: /app

工件现在可以像通常一样保存在CI管道中。

我已经通过在docker构建期间使用
--target
标志解决了这个问题:

docker build --target build-env -t myapp:build .
docker create --name myapp-build myapp:build
docker cp myapp-build:/build/coverage.xml .
docker cp myapp-build:/build/report.xml .
docker rm myapp-build
#proceed with normal build
docker build -t myapp .

然而,
docker compose
建议对我来说看起来更干净。

对于docker 17.05,我知道的唯一选项已经发布:重构以使用run命令和卷装载运行步骤,或者像您所做的那样,
docker cp
。每个选项都需要使用
--target
选项构建特定的构建目标,我怀疑这是您最初的问题

使用19.03中的BuildKit,可以选择构建图像以外的内容。这看起来像:

# import code
FROM golang:1.13 AS code
COPY . /build
WORKDIR /build

# execute tests
FROM code as test
RUN go test ./... -coverprofile=cover.out

# execute build
FROM code as build
RUN go build -o executable

# add a stage for artifacts you wish to extract from the build
FROM scratch as artifacts
COPY --from test /build/coverage.xml /
COPY --from test /build/report.xml /

# and finally the release stage
FROM gcr.io/distroless/base:latest as release
COPY --from=build /build/executable /executable
ENTRYPOINT ["/executable"]
然后,您的build命令如下所示:

mkdir -p artifacts
DOCKER_BUILDKIT=1 docker build -o type=local,dest=artifacts/. --target artifacts .
DOCKER_BUILDKIT=1 docker build -t myapp .

这里的重要细节是
--output
-o
选项,该选项指定BuildKit应如何处理生成的图像。默认情况下,它被导入回本地docker引擎。但在这种情况下,它会将结果写入本地文件系统。

生成服务器上的docker引擎是什么版本?
docker version 17.05.0-ce,build 89658be