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

时间:2015-09-23 17:03:15

标签: docker dockerfile

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

一种解决方案是将基本图像作为参数传递给docker build命令。我不知道这是否可能。

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

也许还有其他方式。

欢迎任何建议?

4 个答案:

答案 0 :(得分:11)

从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

答案 1 :(得分:6)

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

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

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

  

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

答案 2 :(得分:3)

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

将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 .

答案 3 :(得分:0)

在尝试使整个过程自动化的过程中,我创建了一个bash脚本。

在bash脚本中,我运行了以下命令

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

它的作用是替换Dockerfile的第一行(FROM ...),删除整个第一行并将其替换为所需的sourceRegistryUrl。然后,我运行docker build命令(使用特定标签名称)。效果很好。

因此,我没有直接运行Dockerfile,而是运行“ bash脚本”,该脚本将一个命令与另一个命令链接在一起,直到整个过程自动化为止。

相关问题