我使用 docker-compose 并发现以下问题:
当我更改代码并想要重建我使用的docker时
docker-compose stop
docker-compose build
然后我想通过以下方式运行系统:
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
在这种情况下,我们首先应该删除旧容器(通过
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
我知道这个问题提出已经7年了,但这是我找到的解决方案:
docker pull <YOUR_LOGIN_TO_DOCKER_HUB>/<NAME_OF_THE_REPO>:latest
docker-compose stop
docker-compose build
docker-compose up
因此,我们首先使用最新版本更新图像(图像 ID),然后才尝试构建和启动应用程序。
速记:
docker pull <YOUR_LOGIN_TO_DOCKER_HUB>/<NAME_OF_THE_REPO>:latest
docker compose up -d --build --remove-orphans
--remove-orphans
如果旧容器仍保留,则需要将其移除。