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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:55:14