使用GitHub Actions部署Docker Compose遇容器冲突及孤儿容器警告
解决GitHub Actions部署Docker Compose时的容器冲突与孤儿容器问题
问题场景
使用GitHub Actions部署包含Strapi和后端容器的Docker Compose应用,推送新版本镜像到生产环境时出现报错。
报错信息
err: time="2024-11-15T00:00:35Z" level=warning msg="Found orphan containers ([***-strapi-1 ***-***-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up." err: Container ***-api-1 Recreate err: Error response from daemon: Conflict. The container name "/9adc414c29fa_***-api-1" is already in use by container "7a7ecc21b86171712f550001ba9b9dbf84b4a4b55cdcfe8a3d74f46608121e88". You have to remove (or rename) that container to be able to reuse that name.
生产环境部署配置文件
name: Deploy prod stack to DigitalOcean on: create: branches: - release push: branches: - release pull_request: branches: - release jobs: deploy: runs-on: ubuntu-latest steps: - name: Checking out the repository uses: actions/checkout@v3 - name: Copy docker-compose-api.prod.yml over to the server uses: appleboy/scp-action@v0.1.7 with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.PRIVATE_KEY }} passphrase: ${{ secrets.PASSPHRASE }} source: "docker-compose-api.prod.yml" target: /home/${{ secrets.USERNAME }} - name: Run the docker-compose-api.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.SERVER_DATABASE_NAME }} export DATABASE_USERNAME=${{ secrets.DATABASE_USERNAME }} export DATABASE_PASSWORD=${{ secrets.DATABASE_PASSWORD }} export RABBITMQ_HOST=${{ secrets.RABBITMQ_HOST }} export RABBITMQ_DEFAULT_USER=${{ secrets.RABBITMQ_DEFAULT_USER }} export RABBITMQ_DEFAULT_PASSWORD=${{ secrets.RABBITMQ_DEFAULT_PASSWORD }} export RABBITMQ_QUEUE=${{ secrets.RABBITMQ_QUEUE }} export SENDGRID_APIKEY=${{ secrets.SENDGRID_APIKEY }} export SENDGRID_SENDER_EMAIL=${{ secrets.SENDGRID_SENDER_EMAIL }} export GOOGLE_MAPS_API_KEY=${{ secrets.GOOGLE_MAPS_API_KEY }} export ADMIN_DELIVERY_DRIVER_EMAIL=${{ vars.ADMIN_DELIVERY_DRIVER_EMAIL }} docker compose -f docker-compose-api.prod.yml pull docker compose -f docker-compose-api.prod.yml up -d --force-recreate
解决方案
核心问题分析
- 孤儿容器提示:当前compose文件中已移除/重命名的服务仍有残留容器在运行,需要清理。
- 容器名称冲突:
--force-recreate尝试重建容器时,旧容器未完全释放名称,导致新容器无法复用该名称。
修改部署脚本
调整GitHub Actions中SSH步骤的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.SERVER_DATABASE_NAME }} export DATABASE_USERNAME=${{ secrets.DATABASE_USERNAME }} export DATABASE_PASSWORD=${{ secrets.DATABASE_PASSWORD }} export RABBITMQ_HOST=${{ secrets.RABBITMQ_HOST }} export RABBITMQ_DEFAULT_USER=${{ secrets.RABBITMQ_DEFAULT_USER }} export RABBITMQ_DEFAULT_PASSWORD=${{ secrets.RABBITMQ_DEFAULT_PASSWORD }} export RABBITMQ_QUEUE=${{ secrets.RABBITMQ_QUEUE }} export SENDGRID_APIKEY=${{ secrets.SENDGRID_APIKEY }} export SENDGRID_SENDER_EMAIL=${{ secrets.SENDGRID_SENDER_EMAIL }} export GOOGLE_MAPS_API_KEY=${{ secrets.GOOGLE_MAPS_API_KEY }} export ADMIN_DELIVERY_DRIVER_EMAIL=${{ vars.ADMIN_DELIVERY_DRIVER_EMAIL }} docker compose -f docker-compose-api.prod.yml pull # 停止并移除现有容器,同时清理孤儿容器 docker compose -f docker-compose-api.prod.yml down --remove-orphans # 启动新容器 docker compose -f docker-compose-api.prod.yml up -d
方案说明
docker compose down --remove-orphans:彻底停止当前项目的所有容器,移除容器和关联网络,同时自动清理不在当前compose文件中的孤儿容器,解决报错中的两种问题。- 先清理再启动,避免了旧容器名称占用的冲突,同时确保环境干净。
备选方案(保留--force-recreate)
如果需要强制重建容器,也可以直接在up命令中添加--remove-orphans,但建议先执行down确保旧容器完全停止:
docker compose -f docker-compose-api.prod.yml pull docker compose -f docker-compose-api.prod.yml up -d --force-recreate --remove-orphans
内容的提问来源于stack exchange,提问作者user2426691
相关产品推荐
相关产品推荐

