这是我试图实现的目标。我有两个dockerfiles,它们完全相同,唯一的区别是FROM语句。一个基于CentOS,另一个基于RHEL。我遇到的问题是,每当我在一个文件中修改某些内容时,我必须在另一个文件中执行相同操作,因为它们必须相同。
一种解决方案是将基本图像作为参数传递给docker build命令。我不知道这是否可能。
另一种方法是拥有某种包含文件机制。在这种情况下,我将在一个单独的文件中实现所有常见步骤,我将只包含在我的dockerfiles中。
也许还有其他方式。
欢迎任何建议?
答案 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脚本”,该脚本将一个命令与另一个命令链接在一起,直到整个过程自动化为止。