侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

编写一个简单的 GitLab CI/CD 流水线实现 Docker 镜像构建与推送

2025-12-12 / 0 评论 / 5 阅读

题目

编写一个简单的 GitLab CI/CD 流水线实现 Docker 镜像构建与推送

信息

  • 类型:问答
  • 难度:⭐

考点

CI/CD基础概念, Docker镜像构建, 容器仓库推送

快速回答

实现步骤:

  1. 在项目根目录创建 .gitlab-ci.yml 文件
  2. 定义构建阶段(build)和推送阶段(push)
  3. 使用 Docker-in-Docker(dind)作为执行环境
  4. 通过 docker build 构建镜像
  5. 使用 docker push 推送到容器仓库

关键配置:

  • 设置 DOCKER_HOST 环境变量
  • 配置仓库认证信息为 CI/CD 变量
## 解析

原理说明

CI/CD 流水线通过自动化脚本完成代码构建、测试和部署。本示例使用 GitLab CI/CD:

  1. 当代码推送到仓库时触发流水线
  2. 在隔离的 Docker 环境中执行任务
  3. 分阶段完成镜像构建和推送

代码示例

.gitlab-ci.yml 文件:

stages:
  - build
  - push

variables:
  IMAGE_NAME: my-app
  REGISTRY: registry.example.com

# 使用 Docker-in-Docker 环境
services:
  - docker:dind

build-image:
  stage: build
  image: docker:latest
  script:
    - docker build -t $REGISTRY/$IMAGE_NAME:latest .

push-image:
  stage: push
  image: docker:latest
  script:
    - echo "$REGISTRY_PASSWORD" | docker login $REGISTRY -u "$REGISTRY_USER" --password-stdin
    - docker push $REGISTRY/$IMAGE_NAME:latest

最佳实践

  • 安全认证:在 GitLab CI/CD 设置中添加变量 REGISTRY_USERREGISTRY_PASSWORD(掩码保护)
  • 镜像标签:使用 $CI_COMMIT_SHORT_SHA 作为唯一标签替代 latest
  • 缓存优化:添加 Docker 层缓存(如 docker build --cache-from)加速构建

常见错误

  • 权限问题:未配置 services: docker:dind 导致无法执行 Docker 命令
  • 认证失败:未设置 docker login 或 CI/CD 变量名称拼写错误
  • 镜像覆盖:使用 latest 标签可能导致生产环境镜像意外更新

扩展知识

  • 多阶段构建:在 Dockerfile 中使用多阶段构建减小镜像体积
  • 流水线触发:通过 rulesonly/except 控制分支触发规则
  • 云原生集成:推送后可衔接 Kubernetes 部署(如使用 Argo CD)