Как использовать docker-in-docker на локально установленном gitlab-runner в привилегированном режиме - PullRequest
0 голосов
/ 07 ноября 2019

У меня установлен GitLab Runner на запасном компьютере, который я использую для запуска заданий CI, помечая определенные задания. Тем не менее, некоторые задания в моем конвейере требуют docker-in-docker В настоящее время я не могу запустить их на моем локальном gitlab runner. Вместо этого я запускаю их на общих сайтах на gitlab.com. Я прочитал документацию, которая показывает, как использовать привилегированный режим с исполнителем docker в gitlab-runner:

https://docs.gitlab.com/runner/executors/docker.html#use-docker-in-docker-with-privileged-mode

Вот команда, которую я использовал для регистрации gitlab-runner на моемmachine:

sudo gitlab-runner register \
  --non-interactive \
  --url "https://gitlab.com/" \
  --registration-token "$PROJECT_REGISTRATION_TOKEN" \
  --executor "docker" \
  --docker-image alpine:latest \
  --description "docker-runner" \
  --tag-list "privileged" \
  --run-untagged="true" \
  --locked="false" \
  --access-level="not_protected"

Вот /etc/gitlab-runner/config.toml, сгенерированный вышеуказанной командой:

sudo cat /etc/gitlab-runner/config.toml
[sudo] password for brian: 
concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "docker-runner"
  url = "https://gitlab.com/"
  token = "my-token-abcd-1234"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.docker]
    tls_verify = false
    image = "alpine:latest"
    privileged = true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    pull_policy = "always"
    shm_size = 0
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]

Вот задание, которое я пытаюсь запустить в привилегированном режиме:

Build backend:
  tags:
    - privileged
  stage: build
  image: docker:stable
  variables:
    DOCKER_HOST: tcp://docker:2375
    DOCKER_DRIVER: overlay2
  services:
    - docker:dind
  before_script:
    - |
      docker login \
        -u $CI_REGISTRY_USER \
        -p $CI_REGISTRY_PASSWORD \
        $CI_REGISTRY
  script:
    - |
      docker build \
        -t $CI_REGISTRY_IMAGE/backend:latest \
        -f backend/scripts/prod/Dockerfile .
    - docker push $CI_REGISTRY_IMAGE/backend:latest
  only:
    changes:
      - backend/**/*

Вот ошибка, которую я вижу, когда я запускаю это задание:

$ docker login \ # collapsed multi-line command
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
$ docker build \ # collapsed multi-line command
Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?

Я вижу, что задание выбирается моим бегуном и запускает контейнерына моем локальном компьютере, но она не работает по команде docker build, как показано выше.

Я обнаружил, что следующая проблема gitlab, и пробное решение, которое, казалось, работало для многих людей: https://gitlab.com/gitlab-org/gitlab-runner/issues/1986#note_20339074

Похоже, что здесь есть много других решений и много путаницы относительно правильного способа сделать это.

1 Ответ

0 голосов
/ 07 ноября 2019

Я решил проблему, когда писал ее, но хотел поделиться, чтобы облегчить поиск этого решения.

Конец вышеупомянутой темы (https://gitlab.com/gitlab-org/gitlab-runner/issues/1986) ссылки на полезную статью: https://about.gitlab.com/blog/2019/07/31/docker-in-docker-with-docker-19-dot-03/

Отключение TLS работало для меня, как описано в статье.

Сохраняя все так же, как я описал в своем вопросе, добавление

DOCKER_TLS_CERTDIR: ""

в раздел задания variables позволило выполнить задание без ошибок.

...