Docker Compose down未删除容器,部署时容器名冲突问题排查
部署时频繁遇到容器名冲突错误,错误信息如下:
err: Error response from daemon: Conflict. The container name "/***-strapi-1" is already in use by container "f728e54d6ecf05e9be481c94e0f3aa6725ea711ad16ee8feb72cd910818d3ef2". You have to remove (or rename) that container to be able to reuse that name.
尽管在GitHub Actions部署文件中已明确执行容器栈的down操作,仍出现该问题,部署脚本如下:
- name: Run the docker-compose.prod.yml stack uses: appleboy/ssh-action@v0.1.6 with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.PRIVATE_KEY }} passphrase: ${{ secrets.PASSPHRASE }} script: | echo ${{ secrets.CR_PAT }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin export DATABASE_HOST=${{ secrets.DATABASE_HOST }} export DATABASE_PORT=${{ secrets.DATABASE_PORT }} export DATABASE_NAME=${{ secrets.DATABASE_NAME }} export DATABASE_USERNAME=${{ secrets.DATABASE_USERNAME }} export DATABASE_PASSWORD=${{ secrets.DATABASE_PASSWORD }} export APP_KEYS=${{ secrets.APP_KEYS }} export API_TOKEN_SALT=${{ secrets.API_TOKEN_SALT }} export ADMIN_JWT_SECRET=${{ secrets.ADMIN_JWT_SECRET }} export JWT_SECRET=${{ secrets.JWT_SECRET }} export R2_ACCESS_KEY_ID=${{ secrets.R2_ACCESS_KEY_ID }} export R2_ACCESS_SECRET=${{ secrets.R2_ACCESS_SECRET }} export R2_ENDPOINT=${{ secrets.R2_ENDPOINT }} export R2_BUCKET=${{ secrets.R2_BUCKET }} export R2_PUBLIC_ACCESS_URL=${{ secrets.R2_PUBLIC_ACCESS_URL }} export APP_URL=${{ secrets.APP_URL }} docker compose -f docker-compose.prod.yml down docker compose -f docker-compose.prod.yml pull docker compose -f docker-compose.prod.yml up -d
可能的原因
docker compose down执行失败未终止流程:如果down命令因容器无响应、权限不足、网络中断等原因执行失败,但脚本默认会继续执行后续命令,导致up -d尝试创建容器时旧容器仍存在。建议在down后添加错误检查,比如docker compose -f docker-compose.prod.yml down || exit 1,确保失败时停止后续步骤。容器处于不可终止状态:部分容器可能因进程僵死、资源占用等原因,无法被
down命令正常停止和删除。可以通过docker ps -a查看容器状态,若存在已退出但未删除或仍在运行的目标容器,需强制删除,比如追加docker compose rm -f或docker rm -f ***-strapi-1命令。docker compose环境变量不匹配:若脚本设置的环境变量与docker-compose.prod.yml配置冲突,比如COMPOSE_PROJECT_NAME不一致,down只会删除对应项目名的容器,旧容器因属于其他项目名未被清理。需在脚本中统一设置COMPOSE_PROJECT_NAME,确保down和up使用完全一致的环境变量和配置文件。并发部署导致冲突:多个GitHub Actions工作流同时执行部署脚本时,可能出现一个流程执行
down后,另一个流程未完成up,或两个流程同时创建容器的情况。需添加部署锁,确保同一时间只有一个部署任务执行。旧容器不属于当前
docker-compose栈:若之前手动创建过同名容器,或其他部署脚本生成了该容器,当前docker compose down只会删除通过当前配置文件创建的容器,旧容器不会被清理。这种情况需手动删除旧容器,或在部署脚本中先检查并强制删除同名容器。
内容的提问来源于stack exchange,提问作者user9132502

