首页 文章

如何让docker-compose始终从新图像重新创建容器?

提问于
浏览
118

我的docker镜像是在Jenkins CI服务器上构建的,并被推送到我们的私有Docker Registry . 我的目标是使用docker-compose配置环境,它始终启动图像的最初构建状态 .

我目前在不同的机器上使用docker-compose 1.3.2以及1.4.0,但我们之前也使用过旧版本 .

我总是使用 docker-compose pull && docker-compose up -d 命令从注册表中获取新图像并启动它们 . 我相信我的首选行为在某个时间点按预期工作,但从那时起 docker-compose up 开始重新运行先前停止的容器,而不是每次都启动最初构建的映像 .

有没有办法摆脱这种行为?这种方式可能是在docker-compose.yml配置文件中连接的一个,在每次调用时都不依赖于“忘记”命令行上的某些内容吗?

PS . 除了找到实现目标的方法之外,我还想更多地了解这种行为的背景 . 我认为Docker的基本思想是构建一个不可变的基础架构 . docker-compose的当前行为似乎与这种方法完全冲突..或者我在这里错过了一些观点?

5 回答

  • -2

    通过当前的官方documentation,有一个快捷方式可以停止并删除由up创建的容器,网络,卷和图像,如果它们已经被停止或部分删除等等,那么它也会起作用:

    docker-compose down
    

    然后,如果您对图像或Dockerfiles进行了新的更改,请使用:

    docker-compose build --no-cache
    

    最后: docker-compose up

    在一个命令中: docker-compose down && docker-compose build --no-cache && docker-compose up

  • 145

    docker-compose up --force-recreate 是一个选项,但如果您将它用于CI,我将使用 docker-compose rm -f 启动构建以停止并移除容器和卷(然后使用pull and up跟随它) .

    这是我用的:

    docker-compose rm -f
    docker-compose pull
    docker-compose up --build -d
    # Run some tests
    ./tests
    docker-compose stop -t 1
    

    重新创建容器的原因是保留可能使用的任何数据卷(并且它也恰好使 up 更快) .

    如果您正在进行CI,那么您不需要这样做,所以只需删除所有内容就可以满足您的需求 .

    更新:使用 docker-compose 1.7中添加的 up --build

  • 25

    对我有用的唯一解决方案是这个命令:

    docker-compose build --no-cache
    

    这将自动从repo中提取新图像,并且不会使用预先构建的缓存版本以及之前使用过的任何参数 .

  • 65
    $docker-compose build
    

    如果有新的东西,它将被重建 .

  • 14

    您可以将 --force-recreate 传递给 docker compose up ,它应该使用新鲜的容器 .

    我认为重用容器的原因是在开发过程中保留任何变化 . 请注意,Compose执行类似于卷的操作,它也将在容器重新创建之间保持不变(重新创建的容器将附加到其前任卷) . 这可能很有用,例如,如果您将Redis容器用作缓存,并且每次进行少量更改时都不希望丢失缓存 . 在其他时候,它只是令人困惑 .

    我不相信你有任何办法可以从Compose文件中强制执行此操作 .

    可以说它确实与不可变的基础设施原则相冲突 . 反驳可能是你不在 生产环境 中使用Compose(还) . 另外,我不确定我是否同意不可变的infra是Docker的基本思想,尽管它肯定是一个很好的用例/卖点 .

相关问题