以下内容位于我的.gitlab-ci.yml
中stages:
- build
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
services:
- docker:dind
build-image:
image: docker:stable
stage: build
script:
- docker build --no-cache -t repo/myimage:$CI_JOB_ID .
- docker push repo/myimage:$CI_JOB_ID
我已经在Gitlab中设置了DOCKER_AUTH_CONFIG,如下所示(包含所有匹配的可能性)
{
"auths": {
"https://index.docker.io": {
"auth": "...."
},
"https://index.docker.io/v1/": {
"auth": "..."
},
"https://index.docker.io/v2/": {
"auth": "..."
},
"index.docker.io/v1/": {
"auth": "..."
},
"index.docker.io/v2/": {
"auth": "..."
},
"docker.io/repo/myimage": {
"auth": "..."
}
}
}
但是,每当尝试推送图像时,都会发生以下错误
$ docker push repo/myimage:$CI_JOB_ID
The push refers to repository [docker.io/repo/myimage]
ce6466f43b11: Preparing
719d45669b35: Preparing
3b10514a95be: Preparing
63dcf81c7ca7: Waiting
3b10514a95be: Waiting
denied: requested access to the resource is denied
ERROR: Job failed: exit code 1
当我使用带有用户名/密码的Docker登录名时它起作用了。有人请告诉我我在使用DOCKER_AUTH_CONFIG时出错了吗?
感谢堆
问候 锡
答案 0 :(得分:3)
DOCKER_AUTH_CONFIG
在您尝试从私有存储库中提取图像时有效。 Here is the function that uses that config variable.该功能仅由getDockerImage
功能使用。
因此,每当需要将图像推送到工作的script
部分中时,都需要在此之前执行docker login
步骤。
答案 1 :(得分:2)
要将DOCKER_AUTH_CONFIG
的内容用作docker登录,只需将其存储在$HOME/.docker/config.json
中,例如如下:
before_script:
- echo $DOCKER_AUTH_CONFIG > $HOME/.docker/config.json
这允许使用单个配置来加载构建容器的图像,并从相同的配置源访问构建内部的注册表。
注意:这替代了 docker login
另见:https://docs.docker.com/engine/reference/commandline/login/#privileged-user-requirement
答案 2 :(得分:1)
documenation describing DOCKER_AUTH_CONFIG
没有显示带有多个凭据的任何示例。记录的语法为:
{
"auths":{
"registry.hub.docker.com":{
"auth":"xxxxxxxxxxxxxxxxxxxxxxxxxxxx" // base 64 encoded username:password
}
}
}
如您所说,仍然需要在before_script
文件的开头或每个作业中使用gitlab-ci.yml
,如果需要多个验证,则可以使用
before_script:
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin
其中$CI_REGISTRY_USER
和CI_REGISTRY_PASSWORD
是秘密变量。
在每个脚本之后或在整个文件的开头:
after_script:
- docker logout
我写了一个关于使用Gitlab CI和Docker构建docker映像的答案: How to build, push and pull multiple docker containers with gitlab ci?
使用--password-stdin
和秘密而不是简单的-p <password>
是更好的选择。
编辑:mypost中的示例语法取自@Ruwanka Madhushan Can't Access Private MySQL Docker Image From Gitlab CI的出色回答。你应该自己去看看
第二编辑:仅当您想使秘密变量可用于受保护的分支或标记时,才应保护它。如果您未设置任何受保护的brnach或标签,请不要使用受保护的变量。
在文档中:可以保护变量。只要变量受到保护,它就只能安全地传递到在受保护分支或受保护标签上运行的管道。其他管道将不会获得任何受保护的变量。 https://docs.gitlab.com/ee/ci/variables/#protected-variables
答案 3 :(得分:1)
就我而言,问题是盲目地遵循这些文档
如果您需要手动生成令牌,他们会告诉您执行以下操作:
# The use of "-n" - prevents encoding a newline in the password.
echo -n "my_username:my_password" | base64
# Example output to copy
bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ=
我的密码有空格所以...
# Correct encoding
> echo "username:password with spaces in it" | base64
dXNlcm5hbWU6cGFzc3dvcmQgd2l0aCBzcGFjZXMgaW4gaXQK
# Encoding as in docs
> echo -n "username:password with spaces in it" | base64
dXNlcm5hbWU6cGFzc3dvcmQgd2l0aCBzcGFjZXMgaW4gaXQ=