GitLab: 如何在 GitLab CI 中构建 Docker 镜像

本文档属于CI/CD指南的一部分。您可以在此处查看完整指南:如何使用 GitLab CI/CD

👋 欢迎查阅 Stackhero 文档!

Stackhero 提供即开即用的 GitLab cloud 解决方案,专为需要快速、安全、可扩展环境的团队设计:

  • 无限用户、仓库、数据传输和 CI/CD 处理时间,全面满足您的灵活性需求。
  • 一键轻松升级,让您的环境始终保持最新,无需停机。
  • 支持自定义域名并通过HTTPS加密(例如 https://git.your-company.com),提升企业形象与安全性。
  • 在您专属的私有、独立基础设施上,持续高性能强安全性,无“邻居干扰”,实现完全隔离。
  • 灵活选择托管位置:🇪🇺 欧洲🇺🇸 USA,满足合规或延迟需求。

快速上手,专注于您的代码开发。Stackhero 的 GitLab cloud hosting 解决方案大约 5 分钟即可投入使用。

如果您的项目仓库包含 Dockerfile 文件,您可以自动化 Docker 镜像的构建、运行,以及(如有需要)推送到镜像仓库的流程。

首先,请在 Stackhero 控制台中启用“Docker in Docker”(DinD)支持。

启用 DinD 支持存在安全风险,尤其是在您希望隔离用户并防止他们访问彼此项目的场景下。

接下来,更新您的 gitlab-ci.yml 文件,添加使用 DinD 构建 Dockerfile 的流水线配置。以下为示例配置:

image: docker:29

build:
  stage: build
  services:
    - name: docker:29-dind
      alias: docker
  variables:
    # 指定 docker CLI 通过非加密(非 TLS)端口连接 Docker-in-Docker 服务。
    # 详见下方关于 DOCKER_HOST 重要性的说明。
    DOCKER_HOST: "tcp://docker:2375"
    DOCKER_TLS_CERTDIR: ""
  before_script:
    - docker info
  script:
    # 请将 "my-docker-image" 替换为您期望的镜像名称:
    - docker build -t my-docker-image .
    # 如有需要,可测试 Docker 镜像:
    # - docker run my-docker-image /script/to/run/tests

docker:29-dind 服务会在您的作业旁边启动一个 Docker 守护进程,DOCKER_HOST 则指定 docker CLI 使用该守护进程。声明 docker:dind 服务时务必设置 DOCKER_HOST 如果省略该变量,CLI 会悄然连接到其他守护进程,即使服务配置有误,构建也可能成功,从而掩盖真实问题。DOCKER_TLS_CERTDIR: "" 表示使用内部作业网络上的非加密 2375 端口。

作为更简单的替代方案,您可以完全省略 services 块和上述两个变量:Stackhero 的 runner 已通过挂载的 socket 暴露了可用的 Docker 守护进程,因此直接执行 docker build 即可。

如需更多关于在 GitLab CI 中构建 Docker 镜像的指导,请参考 GitLab 官方文档