题目
配置GitLab CI流水线实现Docker镜像构建与推送
信息
- 类型:问答
- 难度:⭐
考点
.gitlab-ci.yml基础结构, Docker镜像构建, 容器镜像推送, CI变量使用
快速回答
实现步骤:
- 创建包含Dockerfile的项目
- 在项目根目录创建
.gitlab-ci.yml文件 - 定义
build阶段和docker build命令 - 使用CI变量存储镜像仓库凭证
- 添加
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_USER和CI_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中扫描镜像漏洞