You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:44:53