如何通过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里远程执行容器更新命令,步骤如下:
- 先把服务器的SSH私钥、登录用户名、服务器地址,还有私有镜像仓库的凭证都存在GitHub Secrets里(比如
SERVER_SSH_KEY、SERVER_USER、SERVER_HOST、REGISTRY_USER、REGISTRY_PASSWORD); - 在工作流里添加一个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




