docker - 从多阶段 Docker 构建中提取文件

标签 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:latest
COPY --from=build-env /build/executable /executable
ENTRYPOINT ["/executable"]

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

最佳答案

在 Docker 17.05 中,我所知道的唯一选项已发布:重构以使用运行命令和卷挂载运行该步骤,或者如您所做的那样,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"]

然后你的构建命令看起来像:
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 构建中提取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59330690/

相关文章:

docker - 将文件从 docker 容器复制到主机

python - 如何确保我的大型 Python 项目的良好测试覆盖率

Docker:无法纠正问题,您持有损坏的软件包

git - 在文件更改时重建 Docker 容器

docker - 使用 Docker REST API 运行带参数的容器

git - "bash: fork: retry: No child processes "运行 docker 快速启动终端或/git bash shell 时

sapui5 - 即使未满足测试覆盖率阈值, karma 覆盖退出代码始终为 0

Python Coverage 说 A 行被覆盖,需要知道从哪里覆盖

docker - 在构建期间复制 docker 镜像中的文件

azure-devops - 如何将 Azure DevOps 构建工件复制到同一管道中的 Docker 镜像构建?