首页 新闻 会员 周边

一个 Dockerfile 如何生成2个镜像

0
悬赏园豆:50 [待解决问题]

参考 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
dudu的主页 dudu | 高人七级 | 园豆:30994
提问于:2022-12-10 10:28

i-web-staging 镜像中的内容竟然是来自 i-api-staging intermediate layer

dudu 1年前

原来 --target 的作用是用 i-api-staging build stage 生成 -t 指定的镜像

dudu 1年前
< >
分享
所有回答(2)
0

目前采用的解决方法是分别执行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 镜像会很快完成

dudu | 园豆:30994 (高人七级) | 2022-12-10 14:05

一次无法构建多个镜像。
另外,需要多个image的情况下,当前这个场景使用一个Dockerfile的好处是什么呢,虽然确实可以通过 -t xxx来实现,但是反而把两个本就独立的应用强行糅合在了一起,后续不感觉有多好维护。而且基本都是CI/CD的流水线再跑,一般只要写一次就可以了,后续不会有手动执行的场景?

支持(0) 反对(0) 宝树呐 | 园豆:318 (菜鸟二级) | 2022-12-10 21:14

@宝树呐: 我们的一个应用的解决方案(sln)通常包含2个 web 项目,一个给用户访问,一个给其他应用通过内网调用 api,需要需要生成2个镜像

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2022-12-11 11:09
0

多 FROM 这种,是为了构建临时镜像。我理解真需要构建多个镜像还是得多次 build 吧。看贴出的问答在看 docker 官网,都只是提到了通过 target 来选择构建镜像,没说一次可以同时构建多个镜像。

幻天芒 | 园豆:37175 (高人七级) | 2022-12-10 20:51

是的,一次最终只能构建出一个镜像

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2022-12-11 11:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册