【问题标题】:How to dynamically change the docker's base image如何动态更改 docker 的基础镜像
【发布时间】:2015-09-23 17:03:15
【问题描述】:

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

对此的一种解决方案是将基本映像作为参数传递给 docker build 命令。不知道有没有可能。

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

【问题讨论】:

    标签: docker dockerfile


    【解决方案1】:

    从 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

    【讨论】:

    • 这行得通!错误地在 docker 版本 16 环境中尝试并没有工作,但版本 18 工作。谢谢!
    • 由于某种原因这对我不起作用。使用这个时我得到invalid reference format: repository name must be lowercase
    • @cyberbeast 也许您需要在MYAPP_IMAGE=repository/image 周围加上一些引号,具体取决于您使用的操作系统?
    • @AntonKrosnev 原来我得到的错误与 docker 没有任何关系。我从 gcr.io 的公共注册表(无发行版图像)中获取了一些图像,并且我将 DOCKER_CONTENT_TRUST 值设置为 1。 Google Container Registry 没有实现 docker 内容信任机制,因此抛出了我提到的错误。
    【解决方案2】:

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

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

    【讨论】:

    • 我对您的示例有点困惑,因为您似乎使用了两个不同的图像“builtfromcentos”和“builtfromrhel”,但我尝试在两种情况下都使用相同的图像并且它有效。
    • 好主意,但如果我想同时构建基础图像标签不同的 docker 图像,则不起作用。
    • 看起来 FROM 可以同时使用 ARG 来定义:jeffgeerling.com/blog/2017/…
    【解决方案3】:

    一个 Dockerfile 中可以有多个 FROM 语句。 比如:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-20
        • 2022-01-22
        • 2017-04-24
        • 1970-01-01
        • 2020-02-26
        • 2017-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多