4. 构建Docker镜像并推送至仓库

任务说明

在CI流水线中,将应用代码构建为Docker镜像并推送至镜像仓库(Docker Hub或私有仓库),使镜像可被后续部署环节直接拉取使用。本案例以GitHub Actions为例,实现一个Node.js应用的镜像构建与推送全流程。

前置依赖

  • GitHub仓库中已有应用代码(含Dockerfile)
  • Docker Hub账号(或私有仓库访问凭证)
  • 仓库已配置DOCKERHUB_USERNAME和DOCKERHUB_两个Secret

核心实现

在仓库根目录创建.github/workflows/docker-build-push.yml,完整流水线定义如下:

name: Build and Push Docker Image

on:
  push:
    branches: [ main ]
  workflow_dispatch:    # 支持手动触发

env:
  IMAGE_NAME: my-node-app

jobs:
  build-and-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.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_ }}

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: |
            ${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:latest
            ${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

对应的最小Dockerfile(位于仓库根目录):

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

运行与验证

  1. 将上述两个文件提交并推送到GitHub仓库的main分支
  2. 在GitHub仓库页面点击 Actions 标签,可看到名为“Build and Push Docker Image”的流水线正在运行
  3. 等待流水线执行完成,所有步骤显示绿色对勾即表示构建推送成功
  4. 登录Docker Hub,在仓库列表中找到my-node-app,确认存在latest和以commit SHA命名的两个镜像标签

判定标准

  • 流水线中Build and push步骤无报错,日志末尾显示exporting manifest和pushing layers完成信息
  • Docker Hub仓库中出现与github.sha对应的镜像标签,且latest标签已更新
  • 本地执行docker pull 你的用户名/my-node-app:latest可成功拉取镜像

私有仓库适配说明

若推送至私有仓库(如Harbor、JFrog),仅需修改docker/login-action的registry参数为私有仓库地址,并将所有镜像标签前缀从DOCKERHUB_USERNAME替换为registry.example.com/项目名,同时将登录凭证Secret替换为对应仓库的访问凭证即可,流水线其余逻辑无需改动。