如何使用访问令牌在Gitlab上推拉Docker镜像并解决双因素认证报错
问题内容
开启双因素认证后向GitLab镜像仓库推送镜像时收到如下报错:
unauthorized: HTTP Basic: Access denied You must use a personal access token with 'api' scope for Git over HTTP
尝试执行以下命令登录依然提示权限被拒绝:
docker login https://registry.gitlab.com/my_registry -u my_user_name -p my_public_key
请问操作存在什么问题?如何使用公钥完成镜像的推拉操作?
问题解答
操作错误原因
- SSH公钥仅用于Git SSH协议的权限校验,GitLab容器Registry基于HTTP协议实现,不支持直接将SSH公钥作为登录密码使用,这是你执行登录命令依然失败的核心原因。
- 开启双因素认证后,所有GitLab HTTP类操作(包括容器Registry登录)都不再支持账号原始密码作为凭证,必须使用对应权限的个人访问令牌。
解决方案
方案1:使用个人访问令牌(推荐,适配所有场景)
- 进入GitLab个人设置 - 访问令牌页面,新建个人访问令牌
- 勾选
read_registry(拉取镜像)、write_registry(推送镜像)权限,按需设置有效期后生成令牌,保存好生成的令牌字符串 - 替换原登录命令的密码参数为生成的令牌,重新执行登录:
docker login https://registry.gitlab.com/my_registry -u my_user_name -p 你的个人访问令牌字符串
登录完成后即可正常推拉镜像。
方案2:使用SSH公钥间接完成认证
如果需要复用已配置的SSH公钥完成登录,可通过GitLab提供的SSH接口获取临时认证令牌:
- 确保本地SSH公钥已上传到GitLab账号的SSH密钥列表中
- 执行命令获取临时令牌:
TOKEN=$(ssh git@gitlab.com registry jwt)
- 使用临时令牌登录Registry:
docker login https://registry.gitlab.com/my_registry -u oauth2 -p $TOKEN
内容的提问来源于stack exchange,提问作者KZiovas
相关产品推荐
相关产品推荐

