使用不同的基础镜像从单个 Dockerfile 使用 Docker 构建 2 个镜像

mun*_*764 4 docker dockerfile

我正在构建最终容器的 2 个变体,一个是完整版,另一个是瘦版。两种变体都分两步构建容器:

  1. 获得full/slim 版本的所有要求并制作一个基本的full/slim 容器
  2. 在 full/slim 基础容器上安装应用程序并制作最终的 full/slim 容器

full/slim 构建都有相同的第二步,它们只是使用不同的基础容器。我想概括第二步,所以我不会有两个 Dockerfiles 包含相同的内容,只是不同的 FROM 字段。

所以我想知道将最后一步作为单个 Dockerfile 的最佳方法是什么,它将生成 2 个图像并且仅在 2 个不同的 FROM 之间切换。我在考虑几种不同的方法:

  • 让 Dockerfile.template 和 bash 从模板生成 2 个定制的 Dockerfile。
  • 有3个不同的文件。通用逻辑文件和 2 个独特的 Dockerfile,用于完整/超薄安装,其中包括通用逻辑文件。
  • Dockerfile 中支持多个 FROM,但在我看来,这可以满足略有不同的需求(所有谷歌搜索都表明了这一点)。

但我想知道,有没有更好的方法?或者我错过了什么?

Tom*_*jes 5

您可以将构建时配置与ARG 一起使用

FROM 指令支持由出现在第一个 FROM 之前的任何 ARG 指令声明的变量。在 FROM 之前声明的 ARG 在构建阶段之外,因此不能在 FROM 之后的任何指令中使用。要使用在第一个 FROM 之前声明的 ARG 的默认值,请使用在构建阶段内没有值的 ARG 指令:

Dockerfile:

ARG imagename
FROM $imagename
RUN echo $imagename
Run Code Online (Sandbox Code Playgroud)

使用两个不同的基础镜像运行:

docker build --build-arg imagename=alpine .
Run Code Online (Sandbox Code Playgroud)

输出:

Step 1/3 : ARG imagename
Step 2/3 : FROM $imagename
latest: Pulling from library/alpine
ff3a5c916c92: Pull complete 
Digest: sha256:e1871801d30885a610511c867de0d6baca7ed4e6a2573d506bbec7fd3b03873f
Status: Downloaded newer image for alpine:latest
 ---> 3fd9065eaf02
Step 3/3 : RUN echo $imagename
 ---> Running in 96b45ef959c3

Removing intermediate container 96b45ef959c3
 ---> 779bfc103e9e
Successfully built 779bfc103e9e
Run Code Online (Sandbox Code Playgroud)

或者:

docker build --build-arg imagename=busybox .
Run Code Online (Sandbox Code Playgroud)

结果是:

Step 1/3 : ARG imagename
Step 2/3 : FROM $imagename
latest: Pulling from library/busybox
07a152489297: Pull complete 
Digest: sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47
Status: Downloaded newer image for busybox:latest
 ---> 8c811b4aec35
Step 3/3 : RUN echo $imagename
 ---> Running in 6027fe4f5b7b

Removing intermediate container 6027fe4f5b7b
 ---> 28640f123967
Successfully built 28640f123967
Run Code Online (Sandbox Code Playgroud)

另请参阅此博文了解更多想法。