使用容器注册表进行身份验证
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
要使用容器注册表进行身份验证,您可以使用:
- GitLab 用户名和密码(如果启用了 2FA 则不可用)
- 个人访问令牌
- 部署令牌
- 项目访问令牌
- 群组访问令牌
- GitLab CLI
对于基于令牌的身份验证方法,所需的最小权限范围:
- 用于读取(拉取)访问,必须为
read_registry - 用于写入(推送)访问,必须为
write_registry和read_registry
管理员模式
在容器注册表身份验证期间不适用。如果您是启用了管理员模式的管理员,
并且创建的个人访问令牌没有 admin_mode 权限范围,即使管理员模式已启用,
该令牌仍然有效。
使用用户名和密码进行身份验证
您可以使用 GitLab 用户名和密码对容器注册表进行身份验证:
docker login registry.example.com -u <username> -p <password>出于安全考虑,建议使用 --password-stdin 标志而不是 -p:
echo "<password>" | docker login registry.example.com -u <username> --password-stdin如果您启用了双因素身份验证 (2FA),则无法使用用户名和密码进行身份验证。 在这种情况下,您必须使用基于令牌的身份验证方法。
使用令牌进行身份验证
要使用令牌进行身份验证,请运行 docker login 命令:
TOKEN=<token>
echo "$TOKEN" | docker login registry.example.com -u <username> --password-stdin身份验证后,客户端会缓存凭据。后续操作会发出授权请求,返回 JWT 令牌, 该令牌仅被授权执行指定的操作。令牌默认有效期为 5 分钟, 在 GitLab.com 上为 15 分钟。
使用 GitLab CI/CD 进行身份验证
要使用 CI/CD 对容器注册表进行身份验证,您可以使用:
-
CI_REGISTRY_USERCI/CD 变量。此变量包含一个具有对容器注册表读写权限的每作业用户。 其密码也会自动创建,并在
CI_REGISTRY_PASSWORD中可用。echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin -
此令牌只能用于读取(拉取)访问。它具有
read_registry权限范围,但不具有推送操作所需的write_registry权限范围。echo "$CI_JOB_TOKEN" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin您也可以使用
gitlab-ci-token方案:echo "$CI_JOB_TOKEN" | docker login $CI_REGISTRY -u gitlab-ci-token --password-stdin -
具有以下最小权限范围的 部署令牌:
- 用于读取(拉取)访问,
read_registry。 - 用于写入(推送)访问,
read_registry和write_registry。
echo "$CI_DEPLOY_PASSWORD" | docker login $CI_REGISTRY -u $CI_DEPLOY_USER --password-stdin - 用于读取(拉取)访问,
-
具有以下最小权限范围的 个人访问令牌:
- 用于读取(拉取)访问,
read_registry。 - 用于写入(推送)访问,
read_registry和write_registry。
echo "<access_token>" | docker login $CI_REGISTRY -u <username> --password-stdin - 用于读取(拉取)访问,
故障排除
docker login 命令失败,显示 access forbidden
容器注册表 向 Docker 客户端返回 GitLab API URL
以验证凭据。Docker 客户端使用基本身份验证,因此请求包含
Authorization 标头。如果对注册表配置中 token_realm 配置的 /jwt/auth 端点的请求中缺少
Authorization 标头,您会收到 access forbidden 错误消息。
例如:
> docker login gitlab.example.com:4567
Username: user
Password:
Error response from daemon: Get "https://gitlab.company.com:4567/v2/": denied: access forbidden为避免此错误,确保请求中的 Authorization 标头未被剥离。
例如,GitLab 前面的代理可能会重定向到 /jwt/auth 端点。
推送大镜像时出现 unauthorized: authentication required
推送大镜像时,您可能会看到如下身份验证错误:
docker push gitlab.example.com/myproject/docs:latest
The push refers to a repository [gitlab.example.com/myproject/docs]
630816f32edb: Preparing
530d5553aec8: Preparing
...
4b0bab9ff599: Waiting
d1c800db26c7: Waiting
42755cf4ee95: Waiting
unauthorized: authentication required当您的身份验证令牌在镜像推送完成前过期时,会发生此错误。 默认情况下,GitLab 自托管实例上的容器注册表令牌在五分钟后过期。 在 GitLab.com 上,令牌过期时间为 15 分钟。