如何让docker-compose总是从新映像重新创建容器?

我的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当前的行为似乎与这种方法明显冲突。还是我漏掉了什么?

396662 次浏览

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

我认为重用容器的原因是为了在开发过程中保留任何更改。注意,Compose对卷做了类似的处理,卷也将在容器重新创建之间保持存在(重新创建的容器将附加到其前任的卷上)。这是很有用的,例如,如果你有一个Redis容器用作缓存,你不想每次做一个小的改变都失去缓存。其他时候,它只是令人困惑。

我不相信有任何方法可以强制从撰写文件。

可以说,它确实与不变的基础设施原则相冲突。相反的观点可能是,您(目前)还没有在生产中使用Compose。此外,我不确定我是否同意不可变基础设施是Docker的基本思想,尽管它确实是一个很好的用例/卖点。

docker-compose up --force-recreate是一个选项,但如果你在CI中使用它,我会用docker-compose rm -f开始构建,以停止并删除容器和卷(然后跟随它的pull和up)。

这是我所使用的:

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

重新创建容器的原因是为了保留可能使用的任何数据量(而且它也恰好使up更快)。

如果你在做CI,你不会想要那样,所以只要去掉所有东西就能得到你想要的。

更新:使用up --build,它是在docker-compose 1.7中添加的

$docker-compose build

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

唯一对我有效的解决方案是--no-cache标志:

docker-compose build --no-cache

这将自动从repo中提取一个新的映像。它也不会使用预先构建的带有您以前使用过的任何参数的缓存版本。

在当前的官方文档中,有一个快捷方式可以停止和删除up创建的容器、网络、卷和映像,如果它们已经停止或部分删除,那么它也会做到这一点:

docker-compose down

然后,如果你在你的图像或dockerfile上有新的变化,使用:

docker-compose build --no-cache

最后:docker-compose up

在一条命令中: Docker-compose down &&Docker-compose build -no-cache &&docker-compose < /代码> < / p >

docker-compose up --build  # still use image cache

docker-compose build --no-cache  # never use cache

通过这个,我在ubuntu AWS中获得了3.5gb的空间。

干净的码头工人

Docker stop $(Docker ps -qa) &Docker系统剪枝-af——volumes

再次构建

Docker构建。

docker-compose构建

docker-compose起来

此外,如果组合有几个服务,我们只想强制构建其中一个:

docker-compose build --no-cache <service>
docker-compose up --build --force-recreate

连同--force-recreate, 你可能也想考虑使用这个标志:

 -V, --renew-anon-volumes   Recreate anonymous volumes instead of retrieving
data from the previous containers.

我不确定从哪个版本这个标志是可用的,所以检查你的docker-compose up --help如果你有或没有