Docker-in-Dockerでレジストリを使って認証します。

Docker-in-Doッカーを使用する場合、サービスと共に新しい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.json を変更するdocker コマンドはすべて失敗します。たとえば、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"
      # If you are running GitLab Runner 13.5
      # or lower you can remove this
      sub_path = "config.json"

オプション3DOCKER_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