Рейтинг:0

Docker/Podman в Docker не работает как задание GitLab CI

флаг cn

Контекст

Я использую свой собственный экземпляр GitLab с дополнительным сервером для CI. В случае, если это имеет значение, мой хост для gitlab runner имеет CentOS 8, gitlab runner версии 14.4.0, а экземпляр gitlab работает под управлением 14.4.1. В настоящее время я использую исполнителя оболочки на сервере CI, но хочу переключиться на исполнителя докеров.

Конфигурация Gitlab Runner

Мой /etc/gitlab-бегун/config.toml выглядит так:

одновременно = 1
контрольный_интервал = 0

[сессионный_сервер]
  session_timeout = 1800

[[бегуны]]
  name = "исполнитель старой оболочки"
  URL-адрес = "https://XXXXXXXXXXXXXXXXXXXXXXXX/"
  токен = "ХХХХХХХХХХХХХХХХХ"
  исполнитель = "оболочка"
  [runners.custom_build_dir]
  [бегунки.кэш]
    [бегуны.кэш.s3]
    [бегуны.cache.gcs]
    [бегунки.cache.azure]

[[бегуны]]
  name = "новый исполнитель докера"
  URL-адрес = "https://XXXXXXXXXXXXXXXXXXXXXXXX/"
  токен = "ХХХХХХХХХХХХХХХХХ"
  исполнитель = "докер"
  [runners.custom_build_dir]
  [бегунки.кэш]
    [бегуны.кэш.s3]
    [бегуны.cache.gcs]
    [бегунки.cache.azure]
  [бегуны.докер]
    tls_verify = ложь
    изображение = "docker.io/centos:7"
    привилегированный = ложь
    disable_entrypoint_overwrite = ложь
    oom_kill_disable = ложь
    отключить_кэш = ложь
    тома = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
    network_mode = "хост"
    шм_размер = 0

Исполнитель оболочки помечен ракушка а исполнителем докера являются теги докер поэтому я могу решить, где запустить мою сборку из файла gitlab-ci.yml.

gitlab-ci.yml

.шаблон:
  до_скрипта:
    - кошка /proc/sys/user/max_user_namespaces
  сценарий:
    - Вход в систему $ENGINE -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
    - $ENGINE build -f container/php-71.dockerfile -t "$CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/$TAG:$CI_PIPELINE_ID" .
    - $ENGINE push "$CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/$TAG:$CI_PIPELINE_ID"

сборка с докером в оболочке-исполнитель:
  расширяет: .template
  переменные:
    ДВИГАТЕЛЬ: докер
    ТЕГ: сборка с докером
  тэги: [оболочка]
сборка с докером в докере-исполнителе:
  расширяет: .template
  образ: докер:динд
  переменные:
    ДВИГАТЕЛЬ: докер
    ТЕГ: сборка с докером в докере
  теги: [докер]
сборка с podman-in-docker-executor:
  расширяет: .template
  изображение: quay.io/podman/stable
  переменные:
    ДВИГАТЕЛЬ: подман
    ТЕГ: сборка с podman-в-докере
  теги: [докер]

Мой контейнер/php-71.dockerfile тривиально, он использует центос: 7 и выполняет куча ням установить команды:

ОТ docker.io/centos:7
ЗАПУСК yum install -y epel-release centos-release-scl
ЗАПУСК yum install -y rh-php71

Первое задание не выполняется, потому что мой пользователь gitlab runner не имеет доступа к докер сокет:

Получил отказ в доступе при попытке подключения к Docker
сокет демона в unix:///var/run/docker.sock: сообщение
"http://%2Fvar%2Frun%2Fdocker.sock/v1.24/auth": набрать unix
/var/run/docker.sock: подключение: разрешение запрещено

Я думаю, что это нормально (или сейчас целесообразно предоставлять доступ к докеру для пользователи без полномочий root?). Так что эта работа существует только для справки.

Docker in docker не работает, потому что у yum нет доступа к сети кажется:

Шаг 1/3: ОТ docker.io/centos:7
 ---> eeb6ee3f44bd
Шаг 2/3: ЗАПУСК yum install -y epel-release centos-release-scl
 ---> Работает в 8e41cd05bcc1
Загруженные плагины: fastmirror, ovl
Определение самых быстрых зеркал
Не удалось получить список зеркал http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=container. Ошибка была
12: Тайм-аут на http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=container: (28, 'Время ожидания разрешения истекло через 30548 миллисекунд')
 Ошибка одного из настроенных репозиториев (неизвестно),
 и у yum недостаточно кэшированных данных для продолжения. В этот момент единственный
 безопасная вещь, которую yum может сделать, это потерпеть неудачу. Есть несколько способов «исправить» это:
     1. Свяжитесь с апстримом для репозитория и попросите их исправить проблему.
     2. Перенастройте базовый URL/и т.д. для репозитория, чтобы указать на рабочий
        вверх по течению. Это чаще всего полезно, если вы используете более новый
        выпуск дистрибутива, чем поддерживается репозиторием (и
        пакеты для предыдущей версии дистрибутива все еще работают).
     3. Запустите команду с временно отключенным репозиторием.
            yum --disablerepo=<репоид> ...
     4. Отключите репозиторий навсегда, чтобы yum не использовал его по умолчанию. Ням
        затем просто проигнорирует репозиторий, пока вы не включите его навсегда
        снова или используйте --enablerepo для временного использования:
            yum-config-manager --disable <репоид>
        или же
            репозитории менеджера подписки --disable=<репоид>
     5. Настройте отказоустойчивый репозиторий для пропуска, если он недоступен.
        Обратите внимание, что yum попытается связаться с репозиторием. когда он выполняет большинство команд,
        так что придется каждый раз пробовать и терпеть неудачу (а значит, ням будет много
        помедленнее). Если это очень временная проблема, это часто приятно
        компромисс:
            yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true
Не удается найти допустимый базовый URL для репо: base/7/x86_64
Команда '/bin/sh -c yum install -y epel-release centos-release-scl' вернула ненулевой код: 1

А podman в докере - самая странная ошибка из всех, он уже фейлится в логин подмана команда:

time="2021-11-01T13:34:31Z" level=warning msg="\"/\" не является общим монтированием, это может вызвать проблемы или отсутствие монтирования с контейнерами без рута"
невозможно клонировать: операция не разрешена
Ошибка: невозможно повторно запустить процесс

Вопрос

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

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.