侧边栏壁纸
博主头像
colo

欲买桂花同载酒

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

配置GitLab CI流水线实现Docker镜像构建与推送

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

题目

配置GitLab CI流水线实现Docker镜像构建与推送

信息

  • 类型:问答
  • 难度:⭐

考点

.gitlab-ci.yml基础结构, Docker镜像构建, 容器镜像推送, CI变量使用

快速回答

实现步骤:

  1. 创建包含Dockerfile的项目
  2. 在项目根目录创建.gitlab-ci.yml文件
  3. 定义build阶段和docker build命令
  4. 使用CI变量存储镜像仓库凭证
  5. 添加docker push命令推送镜像
## 解析

原理说明

GitLab CI通过.gitlab-ci.yml配置文件定义自动化流程。当代码推送到仓库时,GitLab Runner会读取该文件,在容器环境中按阶段执行任务。Docker镜像构建与推送通常包含两个核心步骤:1) 使用Dockerfile构建镜像;2) 将镜像推送到容器仓库(如Docker Hub、GitLab Container Registry)。

代码示例

# .gitlab-ci.yml 示例
stages:
  - build

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

build-and-push:
  stage: build
  image: docker:latest  # 使用Docker官方镜像作为执行环境
  services:
    - docker:dind  # 启用Docker-in-Docker
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $REGISTRY_URL
  script:
    - docker build -t $REGISTRY_URL/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA .
    - docker push $REGISTRY_URL/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA

最佳实践

  • 镜像标签:使用CI_COMMIT_SHORT_SHA作为标签确保唯一性
  • 凭证安全:在GitLab项目的Settings > CI/CD > Variables中设置CI_REGISTRY_USERCI_REGISTRY_PASSWORD,避免硬编码
  • 缓存优化:添加Docker层缓存(例如挂载/var/lib/docker)加速构建

常见错误

  • 未启用Docker-in-Docker:缺少services: - docker:dind导致无法执行docker命令
  • 权限问题:忘记在before_script中登录镜像仓库
  • 路径错误:Dockerfile不在根目录时需指定路径(如docker build -t ... ./subdir

扩展知识

  • 多阶段构建:可在stages中添加test阶段运行容器化测试
  • GitLab Container Registry:可直接使用$CI_REGISTRY变量推送至GitLab内置仓库
  • 镜像扫描:集成Trivy等工具在CI中扫描镜像漏洞