参考 stackoverflow 上 Multiple images, one Dockerfile 的回答中的方法,尝试通过 --target
+ intermediate layer
实现,但尝试没有成功
dockerfile 文件
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN sed -i s@/security.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt-get update && apt-get install -y curl
FROM base AS i-api-staging
WORKDIR /app
COPY publish/api .
FROM base
WORKDIR /app
COPY publish/web .
build 镜像的命令
DOCKER_BUILDKIT=1 docker build --file Dockerfile -t i-web-staging --target i-api-staging .
build 命令执行成功,但 docker images 只能看到 i-web-staging 镜像,看不到 i-api-staging 镜像
--target i-api-staging
的作用是将中间镜像(intrermediate image)i-api-staging 作为最终镜像生成,下面是 build 过程中的输出,有个 exporting to image
,如果能通过某个 docker 命令将中间镜像导出为最终镜像就能解决问题,但没有找到这样的命令
#10 [i-api-staging 2/3] COPY publish/api .
#11 exporting to image
#11 exporting layers
#11 exporting layers 0.6s done
#11 writing image sha256:20d50941941df150f339d06298f4dfa5223e19b5921b5824693e32c54ac2283b done
#11 naming to docker.io/library/i-web-staging done
目前采用的解决方法是分别执行2次 docker build 命令生成镜像
DOCKER_BUILDKIT=1 docker build --file Dockerfile -t i-web-staging .
DOCKER_BUILDKIT=1 docker build --file Dockerfile -t i-api-staging --target i-api-staging .
第1行命令生成 i-web-staging 镜像时中间镜像 i-api-staging 已被缓存,第2行命令生成 i-api-staging 镜像会很快完成
一次无法构建多个镜像。
另外,需要多个image的情况下,当前这个场景使用一个Dockerfile的好处是什么呢,虽然确实可以通过 -t xxx
来实现,但是反而把两个本就独立的应用强行糅合在了一起,后续不感觉有多好维护。而且基本都是CI/CD的流水线再跑,一般只要写一次就可以了,后续不会有手动执行的场景?
@宝树呐: 我们的一个应用的解决方案(sln)通常包含2个 web 项目,一个给用户访问,一个给其他应用通过内网调用 api,需要需要生成2个镜像
多 FROM 这种,是为了构建临时镜像。我理解真需要构建多个镜像还是得多次 build 吧。看贴出的问答在看 docker 官网,都只是提到了通过 target 来选择构建镜像,没说一次可以同时构建多个镜像。
是的,一次最终只能构建出一个镜像
i-web-staging 镜像中的内容竟然是来自 i-api-staging intermediate layer
– dudu 2年前原来
– dudu 2年前--target
的作用是用i-api-staging
build stage 生成-t
指定的镜像