【问题标题】:How to update existing images with docker-compose?如何使用 docker-compose 更新现有图像?
【发布时间】:2018-08-25 06:26:04
【问题描述】:

我有多个微服务,并且正在使用 docker-compose 进行开发部署。当微服务代码库发生一些变化时,我会触发 ci 作业以重新部署它们。我有下面的脚本来做到这一点。但是每次我必须从头开始构建所有图像,然后运行它们。在所有这些操作之后,我有anonymous 图像。所以我使用最后一个脚本来删除它们。你有什么建议让这个过程更实用?有什么方法可以更新现有图像而不用新的更改将其删除?

- docker-compose build
- docker-compose down
- docker-compose up -d --force-recreate
- docker rmi $(docker images -f "dangling=true" -q) -f

附加信息:我正在使用gitlab-ci

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    Docker 容器被设计为短暂的。要更新现有容器,请删除旧容器并启动新容器。 因此,您所遵循的过程是正确的。

    您可以将命令简化为以下命令:

    docker-compose up --force-recreate --build -d
    docker image prune -f
    

    【讨论】:

    • 你错过了 docker-compose 命令中的 -d 标志;这是故意的吗?
    • 我认为该标志很重要,因为不添加它将在前台运行所有内容,会话结束后立即杀死所有内容。添加它的人会发现-d有用/必要。
    • 这似乎缺少docker-compose pull 步骤。 --force-recreate 不会拉取更新的图像;它只是重新创建容器即使图像没有改变。
    • 只是为了确保我理解,所以我必须在每次更新时重建图像并一次又一次地等待它?
    • 所做的只是将我的整个 pi-hole 重置为默认设置,并丢失我所有的广告列表、白名单。 docker pull pihole/pihole:latest 就足够了。
    【解决方案2】:

    您可以使用以下方式更新它:

    docker-compose pull
    

    现在您的图像已更新。如果您运行的是以前版本的容器,则应重新启动它以使用更新的映像:

    docker-compose up --detach
    

    up 命令在镜像或配置更改时自动重新创建容器。

    【讨论】:

    • 只是运行它并没有为我更新容器。您缺少重新运行它的部分。请参阅 stackoverflow.com/a/39501539/1452257 ,这对我有用。
    • @pir 我已添加说明。
    • restart 不起作用,因为它不会从 pull 中重新创建容器,您必须再次执行 downup -d
    • 在我的情况下它会自动重新创建。
    • 我认为结合@yamenk 的评论和这个是最好的方法
    【解决方案3】:

    我更喜欢确保在使用新图像更新容器之前下载所有图像,以最大限度地减少处于中间状态的时间,或者更糟的是,在图像下载失败的情况下处于中间状态。

    1) 我拉最新的图片:

    docker-compose pull
    

    2)然后我重新启动容器:

    docker-compose up -d --remove-orphans
    

    3) 可选地,我删除过时的图像:

    docker image prune
    

    【讨论】:

    • 我喜欢这个答案,因为它不会强制使用 -f--force-recreate,这可能会产生破坏性的副作用。
    • 绝对是最优雅的解决方案!谢谢!
    • 这是一个简单的 bash 脚本,因此您可以使用单个命令运行它 ./update-docker-compose-services.sh: pastebin.com/EdDA5hZ2
    【解决方案4】:
    docker-compose pull
    

    然后

    docker-compose up -d
    

    你不需要 "down" "docker-compose up -d" 命令只会重新创建改变的一个

    【讨论】:

    • 简单明了
    • 如果您没有任何卷,则可以,但如果您这样做,它将删除它们。所以实际上这不是更新。
    • @chunk1ty 请引用描述此内容的文档。 up 命令帮助明确表示“保留已安装的卷”(请参阅​​docker-compose up --help)。 pull 甚至根本没有提到卷。
    • 这两行允许部分升级,即。只有更改的容器才会停止和升级。
    • @makeroo 什么是更改的容器?我确实对容器服务文件进行了更改,现在我被卡住了,不知道如何使用该更改升级该容器或反映该更改?
    【解决方案5】:

    使用 docker-compose 版本 3,您可以为图像添加标签并根据您的逻辑进行清理:

    build: ./dir
    image: yourapp:tag
    

    它可以帮助您避免匿名图像清理

    【讨论】:

      【解决方案6】:

      还有一个脚本,可以一次更新多个 docker-compose 堆栈。

      它被称为compose-update,可以在以下链接中找到:

      https://github.com/FrederikRogalski/compose-update

      compose-update 一个 docker-compose-image-updater

      此 python 脚本自动更新一个或多个 docker-compose 堆栈的图像。

      如果提供了多个 docker-compose 目录,脚本会并行更新它们。

      演示

      用法

      Usage: compose-update [OPTIONS] [UPDATE_DIRS]...
      
        Update docker-compose images automatically.
      
        Takes one or more directorys as input and searches for a
        compose file in one of the following forms:
        "compose.yaml", "compose.yml", "docker-compose.yaml",
        "docker-compose.yml"
      
      Options:
        --prune / --no-prune  Prune docker images after update
                              process if set
        --help                Show this message and exit.
      

      安装

      git clone https://github.com/FrederikRogalski/compose-update.git
      cd compose-updater
      chmod +x update-compose
      

      然后将文件“update-compose”添加到您的路径中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-16
        • 2019-11-04
        • 2021-06-20
        • 1970-01-01
        • 2020-05-25
        • 1970-01-01
        相关资源
        最近更新 更多