Gitlab DOCKER_AUTH_CONFIG不起作用

时间:2018-08-13 02:53:55

标签: docker gitlab gitlab-ci gitlab-ci-runner

以下内容位于我的.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时出错了吗?

感谢堆

问候 锡

4 个答案:

答案 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_USERCI_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)

就我而言,问题是盲目地遵循这些文档

https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#define-an-image-from-a-private-container-registry

如果您需要手动生成令牌,他们会告诉您执行以下操作:

# 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=