docker compose生成docker compose后,运行旧的未更新容器

docker compose生成docker compose后,运行旧的未更新容器,docker,deployment,docker-compose,Docker,Deployment,Docker Compose,我使用docker compose并发现以下问题: 当我更改代码并希望重建我使用的dockers时 docker-compose stop docker-compose build 然后我想通过以下方式运行系统: docker-compose up 但是没有运行新版本的代码/容器,只运行旧版本的代码/容器。怎么办?在这种情况下,我们首先应该移除旧容器(通过rm-f)。因此,我们可以通过以下方式部署新代码: docker-compose build docker-compose stop do

我使用docker compose并发现以下问题:

当我更改代码并希望重建我使用的dockers时

docker-compose stop
docker-compose build
然后我想通过以下方式运行系统:

docker-compose up

但是没有运行新版本的代码/容器,只运行旧版本的代码/容器。怎么办?

在这种情况下,我们首先应该移除旧容器(通过
rm-f
)。因此,我们可以通过以下方式部署新代码:

docker-compose build
docker-compose stop
docker-compose rm -f
docker-compose up
上述顺序并非巧合——当第一条指令生成映像时,旧映像正在运行——但当构建完成时,旧容器被停止、删除并由新构建的容器进行交换

我将上面的命令放在手边“复制粘贴oneliner”:


docker compose build&&docker compose stop&&docker compose rm-f&&docker compose up
你可以使用,
docker compose up--build
docker compose up--build--force recreate
我有一个助手函数来控制一切,这样我们的连续循环就可以被测试了,呃。。。连续不断地。基本上可以归结为以下几点:

要清除容器:

docker rm -f $(docker ps -a -q)
要清除图像,请执行以下操作:

docker rmi -f $(docker images -a -q)
要清除卷,请执行以下操作:

docker volume rm $(docker volume ls -q)
清除网络:

docker network rm $(docker network ls | tail -n+2 | awk '{if($2 !~ /bridge|none|host/){ print $1 }}')
我通常不需要旧的容器、卷和网络,所以为了清除它们,我制作了一个bash脚本,在每次构建之前运行该脚本来清理docker环境。为了使用更新的代码重建docker,我使用了
docker compose-up--build


不起作用-我测试您的解决方案,但两者都不起作用。第一件事:我看到如果我不运行:
docker compose stop
(在您的每个提议之前,我将在后台运行多个容器…)。第二件事:运行的代码没有更新(因为docker composer运行旧的容器-所以在构建之后,我们需要在使用新代码运行容器之前使用
docker compose rm-f
)。最后:如果我们使用
stop
rm
,然后使用您的版本
up--build
,那么我们交换非工作服务的大间隙(构建时间)的容器。对我来说是有效的,我认为docker的新版本(和
up--build
)可能会有一些变化?不,同样的问题。实际有效的方法是在
之后添加
--build
,这在没有其他方法的情况下对我有效,但我不知道为什么-当我运行one liner时,我没有运行任何服务或容器