如何动态更改 docker 的基本图像

How to dynamically change the docker's base image

我有两个 docker 文件,它们完全相同,唯一的区别是 FROM 语句。我遇到的问题是,每当我修改一个文件中的某些内容时,我必须在另一个文件中做同样的事情,因为它们必须相同。

一个解决方案是将基本图像作为参数传递给 docker 构建命令。不知道可不可以。

另一种方法是拥有某种包含文件机制。在那种情况下,我会在一个单独的文件中实现所有常见步骤,我会将该文件包含在我的 Dockerfile 中。

一个 Docker 文件中可以有多个 FROM 语句。 例如:

FROM ubuntu:latest
FROM centos:latest
COPY config /tmp/config
EXPOSE 9080 8080

将创建两个图像。 来自 Docker 参考 docs:

FROM can appear multiple times within a single Dockerfile in order to create multiple images.

您可以使用图像标记来处理这个问题。

将 FROM 更改为:

FROM base-image

然后在构建之前标记 RHEL 或 Centos "base-image"(使用 -f)

$ docker tag -f centos base-image
$ docker build -t my_image/builtfromcentos .
$ docker tag -f rhel base-image
$ docker build -t my_image/builtfromrhel .

从 Docker 版本 17.05 开始,您可以执行如下操作:

ARG MYAPP_IMAGE=myorg/myapp:latest
FROM $MYAPP_IMAGE

您可以提供 MYAPP_IMAGE 作为命令行参数:

docker build -t container_tag --build-arg MYAPP_IMAGE=localimage:latest .

更多信息在这里:https://www.jeffgeerling.com/blog/2017/use-arg-dockerfile-dynamic-image-specification

为了使整个过程自动化,我创建了一个 bash 脚本。

在bash脚本中,我运行下面的命令

sed -i "1 s|.*|FROM ${sourceRegistryUrl}|" Dockerfile
docker build --tag katoneImage:latest .

它的作用是替换 Dockerfile 的第一行 (FROM ...),删除整个第一行并将其替换为我想要的 sourceRegistryUrl。然后我 运行 docker 构建命令(带有特定的标签名称)。这很好用。

因此,我 运行 "bash script" 不是直接 运行 Dockerfile,而是将一个命令与下一个命令链接起来,直到我的整个过程自动化。