Help us learn about your current experience with the documentation. Take the survey.

在 Docker-in-Docker 中验证注册表

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

当你使用 Docker-in-Docker 时,标准认证方法不起作用,因为服务会启动一个新的 Docker 守护进程。

方案 1:运行 docker login

before_script 中,运行 docker login

default:
  image: docker:24.0.5
  services:
    - docker:24.0.5-dind

variables:
  DOCKER_TLS_CERTDIR: "/certs"

build:
  stage: build
  before_script:
    - echo "$DOCKER_REGISTRY_PASS" | docker login $DOCKER_REGISTRY --username $DOCKER_REGISTRY_USER --password-stdin
  script:
    - docker build -t my-docker-image .
    - docker run my-docker-image /script/to/run/tests

要登录 Docker Hub,请将 $DOCKER_REGISTRY 留空或删除。

方案 2:在每个作业中挂载 ~/.docker/config.json

如果你是 GitLab Runner 的管理员,可以将包含认证配置的文件挂载到 ~/.docker/config.json。这样 Runner 接收的每个作业都已经通过认证。如果你使用官方的 docker:24.0.5 镜像,主目录在 /root 下。

如果你挂载配置文件,任何修改 ~/.docker/config.jsondocker 命令都会失败。例如,docker login 会失败,因为文件是以只读方式挂载的。不要将其改为可写,因为这会导致问题。

以下是遵循 DOCKER_AUTH_CONFIG 文档的 /opt/.docker/config.json 示例:

{
    "auths": {
        "https://index.docker.io/v1/": {
            "auth": "bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ="
        }
    }
}

Docker

更新 卷挂载 以包含该文件。

[[runners]]
  ...
  executor = "docker"
  [runners.docker]
    ...
    privileged = true
    volumes = ["/opt/.docker/config.json:/root/.docker/config.json:ro"]

Kubernetes

使用此文件的内容创建一个 ConfigMap。你可以使用类似以下的命令:

kubectl create configmap docker-client-config --namespace gitlab-runner --from-file /opt/.docker/config.json

更新 卷挂载 以包含该文件。

[[runners]]
  ...
  executor = "kubernetes"
  [runners.kubernetes]
    image = "alpine:3.12"
    privileged = true
    [[runners.kubernetes.volumes.config_map]]
      name = "docker-client-config"
      mount_path = "/root/.docker/config.json"
      sub_path = "config.json"

方案 3:使用 DOCKER_AUTH_CONFIG

如果你已经定义了 DOCKER_AUTH_CONFIG,你可以使用该变量并将其保存到 ~/.docker/config.json

你可以通过几种方式定义此认证:

以下示例展示了 before_script。相同的命令适用于你实施的任何解决方案。

default:
  image: docker:24.0.5
  services:
    - docker:24.0.5-dind

variables:
  DOCKER_TLS_CERTDIR: "/certs"

build:
  stage: build
  before_script:
    - mkdir -p $HOME/.docker
    - echo $DOCKER_AUTH_CONFIG > $HOME/.docker/config.json
  script:
    - docker build -t my-docker-image .
    - docker run my-docker-image /script/to/run/tests