【问题标题】:Docker - Upgrading base ImageDocker - 升级基础镜像
【发布时间】:2020-02-26 07:25:24
【问题描述】:

我有一个被 100 个应用程序使用的基础。所有 100 个应用程序在它们的 Dockerfile 中都有一个通用的基础镜像。现在,我正在升级基础映像以进行操作系统升级或其他升级并提升版本,并且我还标记了最新版本。 这里的问题是,每当我更改基本映像时,所有 100 个应用程序都需要更改其 dockerfile 中的基本映像并重建应用程序以使用最新的基本映像。 有没有更好的处理方法?

注意:-我在 Kubernetes 中运行我的容器,并且每个应用程序的 GIT 中都有 Dockerfile。

【问题讨论】:

    标签: docker kubernetes dockerfile docker-image


    【解决方案1】:

    如果您需要部署最后一个版本的基础镜像,是的,您需要再次构建、标记、推送、拉取和部署每个容器。如果您的基础映像未正确标记,则需要更改所有 100 个文件的 dockerfile。

    但您有一些选择,例如使用 sed 替换 dockerfiles 中的所有匹配项,并从指向每个应用程序目录的 sh 文件 执行所有构建命令。

    使用 docker-compose,您可以使用一个命令更新正在运行的 100 个应用程序:

    docker stack deploy --compose-file docker-compose.yml
    

    但仍需要重建容器。

    编辑: 使用 docker compose,您也可以使用一个命令构建 100 个容器,您需要在 compose 文件中定义所有容器,检查码头是否有 compose file

    【讨论】:

    • 我在 Kubernetes 中运行我的应用程序,我的代码在 GIT 中。
    • 重建的不是容器,而是镜像。 docker stack deploy --compose-file docker-compose.yml 不会更新 100 个应用程序,而是在 compose 文件中部署服务。 docker stack 不是docker-compose,它与docker-swarm 有关
    • 这个问题和Kubernetes有关
    【解决方案2】:

    如果每个应用程序使用base-image:latest,则无需为每个应用程序更改Dockerfile。您必须在基础映像更新后重建应用映像。之后,您需要更新应用程序以使用新图像。

    例如使用来自this 答案的建议

    【讨论】:

      【解决方案3】:

      您可以使用 Dockerfile ARG 指令来修改 FROM 行(请参阅 Dockerfile 文档中的 Understand how ARG and FROM interact)。一种可能的方法是让您的 CI 系统注入基本图像标签。

      ARG base=latest
      FROM me/base-image:${base}
      ...
      

      这存在个别开发人员会基于较旧的基础映像构建测试映像的风险;如果图像之间的差异只是操作系统补丁,那么您可能会认为这是一个很小且可以接受的风险,只要只有官方图像被推送到生产环境。

      除此之外,除了修改单个 Dockerfile 之外,没有很多替代方案。你可以编写脚本

      # Individually check out everything first
      BASE=$(pwd)
      TAG=20191031
      for d in *; do
        cd "$BASE/$d"
        sed -i.bak "s@FROM me/base-image.*@FROM:me/base-image:$TAG/" Dockerfile
        git checkout -b "base-image-$TAG"
        git commit -am "Update Dockerfile to base-image:$TAG"
        git push
        hub pull-request --no-edit
      done
      

      也有自动依赖更新工具,这些工具可能能够为您管理它的脚本方面。

      【讨论】:

        【解决方案4】:

        每当我更改基本映像时,所有 100 个应用程序都需要更改其 dockerfile 中的基本映像并重建应用程序以使用最新的基本映像。

        这是一项功能,而不是错误;在继续使用新映像之前,所有 100 个应用程序都需要运行它们的测试(并可能修复任何回归)...

        有一些工具可以扫描所有存储库并自动向 100 个应用程序提交拉取请求(或者,如果您在 Dockerfile 中没有简单的“FROM”行,您也可以编写一个自定义的应用程序)。

        【讨论】:

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