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.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
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