gpt4 book ai didi

docker - 在一次 docker 构建期间标记多个目标

转载 作者:行者123 更新时间:2023-12-03 13:41:15 24 4
gpt4 key购买 nike

我有一个包含多个目标的 Dockerfile。例如:

FROM x as frontend
...

FROM y as backend
...

FROM z as runtime
...
COPY --from=frontend ...
COPY --from=backend ...
为了构建和标记最终图像,我使用:
docker build -t my-project .
为了构建和标记中间目标,我提供 --target争论:
docker build -t my-project-backend --target backend .
但是是否有可能构建一个最终图像并标记所有中间图像?
换句话说,等同于:
docker build -t my-project-frontend --target frontend .
docker build -t my-project-backend --target backend .
docker build -t my-project .
但是用一个命令?
我认为需要一些解释。如果使用 buildkit ( export DOCKER_BUILDKIT=1 ),那么所有独立的目标都是并行构建的。所以它比一个一个地构建它们要快。
我需要标记每个目标以将它们推送到 docker 注册表以及最后一个。
目前我正在 CI 中构建我的图像而没有 buildkit,我正在尝试加快这个过程。

最佳答案

我做了一些搜索,但似乎 docker CLI 目前没有提供任何直接的方法来做到这一点。最接近的是我在my comment中提出的想法: 构建主镜像,然后标记所有中间镜像。
拿这个Dockerfile举个例子:

FROM alpine AS frontend
RUN sleep 15 && touch /frontend

FROM alpine AS backend
RUN sleep 15 && touch /backend

FROM alpine AS runtime
COPY --from=frontend /frontend /frontend
COPY --from=backend /backend /backend
( sleep 只是为了通过缓存明显提高速度)
使用以下方法构建:
export DOCKER_BUILDKIT=1 # enable buildkit for parallel builds
docker build -t my-project .
docker build -t my-project-backend --target backend .
docker build -t my-project-frontend --target frontend .
将要
  • 构建主镜像 runtime首先构建所有需要的中间图像,例如frontendbackend ,并仅用 my-project 标记主图像
  • 构建目标 backend标记为 my-project-backend但使用之前构建中的缓存
  • 相同,但对于 backend

  • 这里的每个图像只会构建一次 - 但最终这与您在问题中已经做过的完全相同,只是顺序不同。
    如果您真的希望能够在单个命令中执行此操作,您可以使用 docker-compose构建“多个图像”:
    version: "3.8"
    services:
    my-project:
    image: my-project
    build: .
    backend:
    image: my-project-backend
    build:
    context: .
    target: backend
    frontend:
    image: my-project-frontend
    build:
    context: .
    target: frontend
    export DOCKER_BUILDKIT=1 # enable buildkit for parallel builds
    export COMPOSE_DOCKER_CLI_BUILD=1 # use docker cli for building
    docker-compose build
    这里 docker-compose基本上会运行相同的 docker build上面给你的命令。
    在这两种情况下,您都应该意识到,尽管缓存层大大加快了构建速度,但每次都会发生新的构建:
  • 将构建上下文 - 即当前目录的内容 - 发送到 docker 守护进程
  • 下载任何远程文件 ADD到图像
    并且仅在内容再次相同时才使用缓存 - 对于大文件/慢速网络将明显减慢。

  • 另一个解决方法 I found in this forum thread是添加一个 LABEL到图像并使用 docker image ls --filter 在构建后获取图像 ID。
    但测试这个似乎 docker image ls使用 buildkit 时不会显示中间图像.此外,这种方法需要更多的命令/专用脚本 - 这将再次比您当前的方法更多的工作。

    关于docker - 在一次 docker 构建期间标记多个目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65021480/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com