gitlab-ci docker-in-docker 访问不安全的注册表

Posted

技术标签:

【中文标题】gitlab-ci docker-in-docker 访问不安全的注册表【英文标题】:gitlab-ci docker-in-docker access to insecure registry 【发布时间】:2018-10-12 11:18:00 【问题描述】:

在配置 gitlab-ci 以构建 docker 映像并将它们推送到我的 gitlab 的不安全注册表时,我遇到了几个错误。我的 gitlab-ci.yaml 如下所示:

stages:
  - build
  - deploy

variables:
  GIT_SUBMODULE_STRATEGY: recursive
  CONTAINER_IMAGE: XXX:$CI_COMMIT_REF_NAME

# The insecure-registry flag 
services:
  - docker:dind

build_container:
  image: docker:latest
  stage: build
  before_script:
    - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" "$CI_REGISTRY" --password-stdin

  script:
    - docker build --pull -t $CONTAINER_IMAGE .
    - docker push $CONTAINER_IMAGE

第一个错误是:

  $ docker login -u gitlab-ci-token -p $CI_JOB_TOKEN myregistry.gitlab.com
  WARNING! Using --password via the CLI is insecure. Use --password-stdin.
  Warning: failed to get default registry endpoint from daemon (Cannot connect 
  to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon 
  running?). Using system default: https://index.docker.io/v1/
  Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the 
  docker daemon running?

通过将登录命令更新为解决此问题

echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" myregistry.gitlab.com --password-stdin

可惜更新后又遇到一个错误:

$ echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" myregistry.gitlab.com --password-stdin
Error response from daemon: Get https://myregistry.gitlab.com/v2/: dial tcp XX.XX.XXX.XXX:443: getsockopt: connection refused

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

与任何其他 docker 安装一样,有必要指示 docker 守护进程允许连接到不安全的注册表。为了在 docker-in-docker 服务的上下文中执行此操作,必须将此配置传递给服务。这可以通过更新您的 gitlab-ci.yaml 以将服务指定为:

services:
  - name: docker:dind
    command: ["--insecure-registry=myregistry.gitlab.com"]

【讨论】:

你拯救了我的一天。谢谢 @mcguip 你知道在这种情况下使用环境变量 ($CI_REGISTRY) 的方法吗? @mathiasfk,该示例已经使用了多个环境变量。你有更具体的追求吗? 我的意思是使用类似command: ["--insecure-registry=$CI_REGISTRY"] 的东西。在这种情况下,上下文属于跑步者,因此该变量对服务不可见。 我明白了。一个好问题;但是,我没有想到答案,也无法在 docker 文档中找到任何内容。也许您可能会提出一个单独的问题,因为这更普遍适用于 dockerfile 命令语句中的变量替换。

以上是关于gitlab-ci docker-in-docker 访问不安全的注册表的主要内容,如果未能解决你的问题,请参考以下文章

Docker-in-Docker: Jenkins CI 内部如何运行 docker

Docker 容器网络与 Docker-in-Docker

无需 Docker-in-Docker 的私有 Gitlab Runner 代码质量

从 GitLab CI 运行器连接到 docker-in-docker

docker-in-docker (dind) 服务在 gitlab ci 中的作用

Docker-in-Docker 与 Gitlab 共享运行器,用于构建和推送 docker 镜像到注册表