如何得到docker合成总是从新鲜的图像重新创build容器?

我的docker图像build立在Jenkins CI服务器上,并被推送到我们的私人dockerregistry。 我的目标是configurationdocker-compose环境,它始终启动图像的原始状态。

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

我总是使用docker-compose pull && docker-compose up -d命令从registry中获取新图像并启动它们。 我相信我的首选行为在某个时间点能按预期工作,但自那时以来, docker-compose up开始重新运行以前停止的容器,而不是每次启动原始的图像。

有没有办法摆脱这种行为? 那么可以通过docker-compose.ymlconfiguration文件中的每一个调用来在命令行上不依赖于“不会忘记”的东西吗?

PS。 除了find一个方法来实现我的目标,我也很想了解这个行为的背景。 我认为Docker的基本思想是构build一个不可变的基础架构。 docker的构成现在的行为只是似乎与这种方法的普通冲突..或者我错过了这里的一些观点?

docker-compose up --force-recreate是一个选项,但是如果你使用它作为CI,我会用docker-compose rm -f开始构build,以停止和移除容器和卷(然后跟随它拉和向上)。

这是我使用的:

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

容器被重新创build的原因是为了保留任何可能使用的数据量(并且它也快速地增加)。

如果你正在做CI,你不需要这样做,所以只是删除一切应该让你想要的。

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

唯一的解决scheme是我的工作是这个命令:

 docker-compose build --no-cache 

这将自动从回购拉动新鲜的图像,并不会使用以前使用的任何参数prebuildcaching版本。

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

我认为重复使用容器的原因是在开发过程中保留任何变化。 请注意,Compose与卷相似,在容器重新创build(重新创build的容器将附加到其前一个卷)之间也将保持不变。 例如,如果您将Redis容器用作caching,并且每次进行小的更改时都不想丢失caching,则这会很有帮助。 在其他时候,这只是混乱。

我不相信有什么办法可以从撰写文件强制这个。

可以说它确实与不可变的基础设施原则相冲突。 反面的观点可能是你在生产(还)中不使用Compose。 另外,我不确定我是否同意不可变的基础是Docker的基本概念,尽pipe它肯定是一个很好的用例/卖点。

通过当前的官方文档,有一个捷径,可以停止并移除由up创build的容器,networking,卷和图像,如果它们已经停止或部分删除等等,那么它也可以做到这一点:

 docker-compose down 

那么,如果你有你的图像或Dockerfiles使用新的变化:

 docker-compose build --no-cache 

最后: docker-compose up

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

 $docker-compose build 

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