You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过GitHub Action自动将Docker容器更新至镜像最新版本?

如何通过GitHub Action自动将Docker容器更新至镜像最新版本?

嘿,我完全懂你想要即时触发容器更新的需求——定期轮询确实不够灵活,尤其是自己的个人项目,刚推完镜像就想马上看到更新效果对吧?下面给你几个靠谱的方案,结合你的GitHub Action工作流来实现:

方案一:利用Watchtower的Webhook触发即时更新

你提到的Watchtower其实真的支持Webhook触发,完全不用等它定期轮询!具体步骤如下:

  • 首先,在你的服务器上重新启动Watchtower,开启API和Webhook支持,记得设置一个安全令牌防止非法请求:
    docker run -d \
      --name watchtower \
      --volume /var/run/docker.sock:/var/run/docker.sock \
      containrrr/watchtower \
      --enable-api \
      --api-token=你的自定义安全令牌
    
    这里的--api-token可以用openssl rand -hex 16生成一串复杂字符串,保证安全性。
  • 然后,在你的GitHub Action工作流里,当镜像成功推送到私有仓库后,添加一个步骤发送POST请求到Watchtower的API:
    - name: 触发Watchtower更新容器
      run: |
        curl -X POST \
          -H "Authorization: Bearer ${{ secrets.WATCHTOWER_API_TOKEN }}" \
          https://你的服务器域名或IP:8080/v1/update?service=你的容器名称
    
    补充说明:
    • service参数可以指定只更新某个特定容器,去掉该参数则会一次性更新所有受Watchtower管理的容器;
    • 务必把安全令牌存在GitHub Secrets里(比如命名为WATCHTOWER_API_TOKEN),绝对不要硬编码在工作流中;
    • 确保服务器的8080端口对外开放,或者用反向代理把API路径映射到HTTPS端口,避免明文传输令牌。

方案二:直接通过GitHub Action的SSH步骤更新容器

如果你不想依赖Watchtower,也可以沿用你之前SSH Deploy的思路,直接在Action里远程执行容器更新命令,步骤如下:

  1. 先把服务器的SSH私钥、登录用户名、服务器地址,还有私有镜像仓库的凭证都存在GitHub Secrets里(比如SERVER_SSH_KEYSERVER_USERSERVER_HOSTREGISTRY_USERREGISTRY_PASSWORD);
  2. 在工作流里添加一个SSH执行步骤,用成熟的Action工具比如appleboy/ssh-action
- name: 远程更新Docker容器
  uses: appleboy/ssh-action@v1.0.3
  with:
    host: ${{ secrets.SERVER_HOST }}
    username: ${{ secrets.SERVER_USER }}
    key: ${{ secrets.SERVER_SSH_KEY }}
    script: |
      # 登录私有镜像仓库(需要认证时执行)
      echo ${{ secrets.REGISTRY_PASSWORD }} | docker login 你的私有仓库地址 -u ${{ secrets.REGISTRY_USER }} --password-stdin
      # 拉取最新镜像
      docker pull 你的镜像名:你的标签
      # 如果用Docker Compose管理,直接替换为下面两行更简便
      # docker-compose pull 你的服务名
      # docker-compose up -d 你的服务名
      
      # 停止并替换旧容器
      docker stop 你的容器名称
      docker rm 你的容器名称
      docker run -d --name 你的容器名称 你的镜像名:你的标签
      # 清理无用旧镜像(可选,节省服务器空间)
      docker image prune -f

这个方案的好处是完全可控,你可以在更新前后加入自定义脚本(比如备份数据库、清理缓存等),适合有特殊操作需求的场景。

两种方案对比

  • Watchtower方案:省心省力,它会自动处理镜像拉取、容器替换、环境变量继承、旧镜像清理这些细节,适合管理多个容器的场景;
  • SSH直接执行方案:灵活性更高,适合需要自定义更新流程的项目,不需要额外运行Watchtower容器。

备注:内容来源于stack exchange,提问作者Gradyn Wursten

火山引擎 最新活动