首页 > 解决方案 > Docker LABEL 在多阶段构建中访问构建映像

问题描述

在我的 CI 构建期间,我在多阶段 Docker 构建(测试报告)中从构建镜像中提取构建工件,方法是添加一个LABEL构建步骤,然后创建一个带有标记图像的容器来提取工件。这似乎在 Docker Desktop for Mac 中被破坏了,或者我误解了它应该如何工作?

这是重现该问题的最小构建:

# Dockerfile.one

FROM alpine AS one

WORKDIR /test
RUN touch here
LABEL build=here
# Dockerfile.two

FROM alpine AS one

WORKDIR /test
RUN touch here
LABEL build=here

FROM alpine AS two
COPY --from=one /test/* /test/
RUN touch again
# test.sh
#! /bin/bash -u

# Clean up
trap 'rm -r test & docker rmi $image' EXIT

docker build -f $1 .
docker images --filter 'label=build=here'

image=$(docker images --filter 'label=build=here' -q | head -n 1)
id=$(docker create $image) && docker cp $id:/test/ . && docker rm $id
ls -l test

运行(仅一个阶段)会产生工作目录中存在./test.sh Dockerfile.one的文件的预期输出。here

但是,运行./test.sh Dockerfile.two(多阶段)失败,显然是因为没有图像匹配--filter label=build=here

这里有什么问题?


$ docker version
Client:
 Cloud integration: 1.0.17
 Version:           20.10.7
 API version:       1.41
 Go version:        go1.16.4
 Git commit:        f0df350
 Built:             Wed Jun  2 11:56:22 2021
 OS/Arch:           darwin/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.7
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       b0f5bc3
  Built:            Wed Jun  2 11:54:58 2021
  OS/Arch:          linux/amd64
  Experimental:     true

标签: dockerdockerfile

解决方案


推荐阅读