在Github Action中实现Docker镜像自动打标签推送及部署自动拉取
实现Docker镜像构建推送与自动部署的GitHub Action方案
一、镜像构建与推送Action(.github/workflows/build-push.yml)
这个Action会在代码推送到main分支时触发,自动构建Docker镜像、生成唯一标签并推送到Docker Hub。
核心步骤说明
- 用短Commit SHA+时间戳生成唯一标签,确保每次构建的标签不重复
- 使用Docker Buildx提升构建效率,支持多平台(可选)
- 登录Docker Hub需要提前在GitHub仓库的
Settings > Secrets and variables > Actions中配置DOCKER_HUB_USERNAME和DOCKER_HUB_TOKEN
name: Build and Push Docker Image on: push: branches: [ main ] jobs: build-push: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_TOKEN }} - name: Generate unique image tag id: generate-tag run: | # 生成短SHA+时间戳的标签,格式如:abc123-202405201234 TAG=$(git rev-parse --short HEAD)-$(date +%Y%m%d%H%M) echo "tag=$TAG" >> $GITHUB_OUTPUT - name: Build and push Docker image uses: docker/build-push-action@v5 with: context: . push: true tags: | ${{ secrets.DOCKER_HUB_USERNAME }}/your-image-name:${{ steps.generate-tag.outputs.tag }} ${{ secrets.DOCKER_HUB_USERNAME }}/your-image-name:latest # 可选:同时打latest标签 - name: Upload image tag as artifact uses: actions/upload-artifact@v4 with: name: image-tag-artifact path: | ${{ steps.generate-tag.outputs.tag }}
二、服务器部署Action(.github/workflows/deploy.yml)
这个Action会在镜像构建推送完成后自动触发,拉取对应标签的镜像并部署。
核心步骤说明
- 通过
workflow_run触发,监听第一个Action的完成事件 - 从第一个Action上传的Artifact中读取镜像标签
- 服务器部署需要提前配置服务器的SSH密钥(
SERVER_SSH_KEY)和服务器地址(SERVER_HOST)
name: Deploy to Server on: workflow_run: workflows: ["Build and Push Docker Image"] types: [completed] branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - name: Download image tag artifact uses: dawidd6/action-download-artifact@v2 with: workflow: build-push.yml run_id: ${{ github.event.workflow_run.id }} name: image-tag-artifact - name: Read image tag id: get-tag run: | TAG=$(cat $GITHUB_WORKSPACE/${{ secrets.DOCKER_HUB_USERNAME }}/your-image-name:*) echo "tag=$TAG" >> $GITHUB_OUTPUT - name: Deploy to server via SSH uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.SERVER_HOST }} username: root # 替换为你的服务器用户名 key: ${{ secrets.SERVER_SSH_KEY }} script: | # 登录Docker Hub(私有镜像需执行) docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} -p ${{ secrets.DOCKER_HUB_TOKEN }} # 拉取对应标签的镜像 docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/your-image-name:${{ steps.get-tag.outputs.tag }} # 停止并清理旧容器 docker stop your-container-name || true docker rm your-container-name || true # 启动新容器(根据实际端口和配置调整) docker run -d --name your-container-name -p 80:80 ${{ secrets.DOCKER_HUB_USERNAME }}/your-image-name:${{ steps.get-tag.outputs.tag }} # 清理无用镜像 docker image prune -f
关键配置注意事项
- 所有敏感信息(用户名、令牌、SSH密钥等)必须存在GitHub仓库的Action Secrets中,禁止硬编码
- 镜像标签规则可按需调整,比如仅使用短Commit SHA(
git rev-parse --short HEAD)或结合分支名 - 多环境部署可通过分支触发不同Action,或添加环境变量区分测试/生产环境
内容的提问来源于stack exchange,提问作者Fhuad Balogun
相关产品推荐
相关产品推荐

