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

Dra*_*lic 7 docker dockerfile

这是我试图实现的目标.我有两个dockerfiles,它们完全相同,唯一的区别是FROM语句.一个基于CentOS,另一个基于RHEL.我遇到的问题是,每当我在一个文件中修改某些内容时,我必须在另一个文件中执行相同操作,因为它们必须相同.

对此的一个解决方案是将基础映像作为参数传递给docker build命令.我不知道这是否可能.

另一种方法是拥有某种包含文件机制.在这种情况下,我将在一个单独的文件中实现所有常见步骤,我将只包含在我的dockerfiles中.

也许还有其他方式.

有什么建议值得欢迎吗?

Ant*_*nev 17

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

ARG MYAPP_IMAGE=myorg/myapp:latest
FROM $MYAPP_IMAGE
Run Code Online (Sandbox Code Playgroud)

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

docker build -t container_tag --build-arg MYAPP_IMAGE=localimage:latest .
Run Code Online (Sandbox Code Playgroud)

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

  • @AntonKrosnev 事实证明我遇到的错误与 docker 没有任何关系。我从 gcr.io 的公共注册表(distroless 图像)中获取一些图像,并且将“DOCKER_CONTENT_TRUST”值设置为“1”。Google 容器注册表没有实现 docker 内容信任机制,因此引发了我提到的错误。 (2认同)

Ale*_*lva 7

您可以在Dockerfile中拥有多个FROM语句.例如:

FROM ubuntu:latest
FROM centos:latest
COPY config /tmp/config
EXPOSE 9080 8080
Run Code Online (Sandbox Code Playgroud)

将创建两个图像.来自Docker参考文档:

FROM可以在单个Dockerfile中多次出现,以创建多个图像.


小智 7

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

将 FROM 更改为:

FROM base-image
Run Code Online (Sandbox Code Playgroud)

然后在构建之前标记 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 .
Run Code Online (Sandbox Code Playgroud)