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"]
运行与验证
- 将上述两个文件提交并推送到GitHub仓库的
main分支 - 在GitHub仓库页面点击 Actions 标签,可看到名为“Build and Push Docker Image”的流水线正在运行
- 等待流水线执行完成,所有步骤显示绿色对勾即表示构建推送成功
- 登录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替换为对应仓库的访问凭证即可,流水线其余逻辑无需改动。