Docker多阶段构建仅生成一个镜像?如何获取多个镜像?
问题解答
为什么只看到一个镜像?
你执行docker image build -t app:latest ./时,-t参数只会给Dockerfile里最后一个阶段的镜像打上标签。前面的build阶段属于构建过程的中间镜像,默认没有仓库名和标签(会显示为<none>:<none>),如果你的docker image ls -a没显示这类镜像,要么是Docker自动清理了未被引用的中间镜像,要么是你没注意到列表里的<none>条目。
多阶段构建的设计初衷就是用前面的阶段做构建环境,最终只保留轻量的运行镜像,所以默认不会给中间阶段打标签。
能不能获取两个镜像?
当然可以,两种方法:
方法一:构建时指定目标阶段打标签
先单独构建并标记build阶段的镜像:docker image build -t app-build:latest --target build ./之后再构建最终的运行镜像:
docker image build -t app:latest ./这样
docker image ls -a就能看到两个带标签的镜像。方法二:给已存在的中间镜像打标签
重新构建时查看详细过程,找到build阶段的镜像ID:docker image build --no-cache --progress=plain ./在输出里找到类似
---> <IMAGE_ID>的行(对应build阶段完成后的镜像),然后给它打标签:docker tag <IMAGE_ID> app-build:latest
为什么别人能得到三个镜像?
你看到的Stack Overflow案例里出现三个镜像,大概率是因为:
- 对方的Dockerfile有三个构建阶段;
- 或者列表里包含了基础镜像(比如
alpine:3.18.4)加上两个阶段的镜像,总共三个条目。
内容的提问来源于stack exchange,提问作者Pro
相关产品推荐
相关产品推荐

