将 Bake 与其他上下文一起使用

除了定义构建上下文的主键外,每个 Target 还可以使用使用 key 定义的映射来定义其他命名上下文。这些值映射到 build 中的标志 命令contextcontexts--build-context

在 Dockerfile 中,这些上下文可以与 instruction 或 flag 一起使用。FROM--from

支持的上下文值包括:

  • 本地文件系统目录
  • 容器镜像
  • Git 网址
  • HTTP 网址
  • Bake 文件中另一个目标的名称

固定 alpine 镜像

# syntax=docker/dockerfile:1
FROM alpine
RUN echo "Hello world"
# docker-bake.hcl
target "app" {
  contexts = {
    alpine = "docker-image://alpine:3.13"
  }
}

使用辅助源目录

# syntax=docker/dockerfile:1
FROM scratch AS src

FROM golang
COPY --from=src . .
# docker-bake.hcl
target "app" {
  contexts = {
    src = "../path/to/source"
  }
}

将目标用作构建上下文

要将一个目标的结果用作另一个目标的构建上下文,请指定目标 name 和 prefix。target:

# syntax=docker/dockerfile:1
FROM baseapp
RUN echo "Hello world"
# docker-bake.hcl
target "base" {
  dockerfile = "baseapp.Dockerfile"
}

target "app" {
  contexts = {
    baseapp = "target:base"
  }
}

在大多数情况下,您应该只使用单个多阶段 Dockerfile,其中包含多个 目标进行类似行为。仅在以下情况下建议使用此案例 多个 Dockerfile,这些 Dockerfile 无法轻松合并为一个。

删除重复的上下文传输

注意

从 Buildx 版本 0.17.0 及更高版本开始,Bake 会自动删除重复数据 Context Transfer (上下文传输)。除了 Buildx 版本 0.17.0,则构建器必须运行 BuildKit 版本 0.16.0 或 later,并且 Dockerfile 语法必须是 or later。docker/dockerfile:1.10

如果您满足这些要求,则无需手动删除重复数据 上下文传输,如本节所述。

  • 要检查您的 Buildx 版本,请运行 .docker buildx version
  • 要检查您的 BuildKit 版本,请运行 并 寻找 field.docker buildx inspect --bootstrapBuildKit version
  • 要检查 Dockerfile 语法版本,请检查 Dockerfile 中的 parser 指令。如果 它不存在,默认版本与您的 当前版本的 BuildKit。要显式设置版本,请在 Dockerfile 的顶部添加。syntax#syntax=docker/dockerfile:1.10

当您使用组并发构建目标时,将加载构建上下文 独立。如果多个目标使用相同的上下文 在组中,每次使用该上下文时,都会传输一次该上下文。这可以 对构建时间产生重大影响,具体取决于您的构建 配置。例如,假设您有一个 Bake 文件,它定义了以下内容 目标组:

group "default" {
  targets = ["target1", "target2"]
}

target "target1" {
  target = "target1"
  context = "."
}

target "target2" {
  target = "target2"
  context = "."
}

在这种情况下,当您构建默认的 组:一次用于 ,一次用于 ..target1target2

如果您的上下文较小,并且您使用的是本地构建器,请复制 上下文传输可能没什么大不了的。但是,如果您的构建上下文很大,或者 您有大量目标,或者您正在通过 网络传输到远程构建器,上下文传输将成为性能瓶颈。

为避免多次传输同一上下文,您可以定义一个命名的 context 的 context,它只加载上下文文件,并且每个目标都需要 这些文件引用该命名 context。例如,以下 Bake 文件 定义一个命名 target ,该目标由 和 一起使用:ctxtarget1target2

group "default" {
  targets = ["target1", "target2"]
}

target "ctx" {
  context = "."
  target = "ctx"
}

target "target1" {
  target = "target1"
  contexts = {
    ctx = "target:ctx"
  }
}

target "target2" {
  target = "target2"
  contexts = {
    ctx = "target:ctx"
  }
}

命名上下文表示一个 Dockerfile 阶段,该阶段将复制文件 从其上下文 () 中。Dockerfile 中的其他阶段现在可以引用命名上下文,例如,使用 .ctx.ctx--mount=from=ctx

FROM scratch AS ctx
COPY --link . .

FROM golang:alpine AS target1
WORKDIR /work
RUN --mount=from=ctx \
    go build -o /out/client ./cmd/client \

FROM golang:alpine AS target2
WORKDIR /work
RUN --mount=from=ctx \
    go build -o /out/server ./cmd/server