题目
编写一个简单的 GitLab CI/CD 流水线实现 Docker 镜像构建与推送
信息
- 类型:问答
- 难度:⭐
考点
CI/CD基础概念, Docker镜像构建, 容器仓库推送
快速回答
实现步骤:
- 在项目根目录创建
.gitlab-ci.yml文件 - 定义构建阶段(build)和推送阶段(push)
- 使用 Docker-in-Docker(dind)作为执行环境
- 通过
docker build构建镜像 - 使用
docker push推送到容器仓库
关键配置:
- 设置
DOCKER_HOST环境变量 - 配置仓库认证信息为 CI/CD 变量
原理说明
CI/CD 流水线通过自动化脚本完成代码构建、测试和部署。本示例使用 GitLab CI/CD:
- 当代码推送到仓库时触发流水线
- 在隔离的 Docker 环境中执行任务
- 分阶段完成镜像构建和推送
代码示例
.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_USER和REGISTRY_PASSWORD(掩码保护) - 镜像标签:使用
$CI_COMMIT_SHORT_SHA作为唯一标签替代latest - 缓存优化:添加 Docker 层缓存(如
docker build --cache-from)加速构建
常见错误
- 权限问题:未配置
services: docker:dind导致无法执行 Docker 命令 - 认证失败:未设置
docker login或 CI/CD 变量名称拼写错误 - 镜像覆盖:使用
latest标签可能导致生产环境镜像意外更新
扩展知识
- 多阶段构建:在 Dockerfile 中使用多阶段构建减小镜像体积
- 流水线触发:通过
rules或only/except控制分支触发规则 - 云原生集成:推送后可衔接 Kubernetes 部署(如使用 Argo CD)