Docker-in-Dockerでレジストリに対して認証する
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
Docker-in-Dockerを使用する場合、サービスによって新しいDockerデーモンが起動されるため、標準の認証方法は機能しません。
オプション1: docker loginを実行する
before_scriptで、docker loginを実行します:
default:
image: docker:24.0.5-cli
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/testsDocker 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"
sub_path = "config.json"オプション3: DOCKER_AUTH_CONFIGを使用する
すでにDOCKER_AUTH_CONFIGが定義されている場合は、その変数を使用して、それを~/.docker/config.jsonに保存できます。
この認証は、次の複数の方法で定義できます:
- Runner設定ファイル内の
pre_build_scriptで定義する。 before_scriptで定義する。scriptで定義する。
次の例はbefore_scriptを示しています。どの実装方法でも、同じコマンドが適用されます。
default:
image: docker:24.0.5-cli
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