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

时间:2015-09-16 15:18:09

标签: docker 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的当前行为似乎与这种方法完全冲突..或者我在这里错过了一些观点?

7 个答案:

答案 0 :(得分:177)

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,那么您不需要这样做,所以只需删除所有内容就可以满足您的需求。

更新:使用up --build 1.7

中添加的docker-compose

答案 1 :(得分:85)

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

overridableFunction()

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

答案 2 :(得分:34)

通过当前官方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

答案 3 :(得分:14)

您可以将--force-recreate传递给docker compose up,{{1}}应使用新容器。

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

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

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

答案 4 :(得分:7)

#include <stdio.h>

#define M(x) x - x

int main () {
    printf ("%d %d\n",M(M (1+2)) , M(M (3)));
    return 0;
}

6 -6

答案 5 :(得分:2)

我通过此方法在ubuntu AWS中声明了3.5gb的空间。

清洁码头工人

docker stop $(docker ps -qa)&& docker system prune -af --volumes

重新构建

docker build。

docker-compose build

docker-compose up

答案 6 :(得分:-5)

$docker-compose build

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