Запуск systemd в контейнере Concourse
В настоящее время я пытаюсь заставить контейнер CentOS работать с включенным systemd, чтобы использовать его в качестве среды для задачи Concourse. Связанный конвейер создает пакеты RPM, которые устанавливают службы, управляемые systemd, и я хотел бы запустить тесты в среде, максимально приближенной к предполагаемому варианту использования. Мой контейнер основан на кратком мануале по использованию systemd внутри контейнера CentOS из описания образа CentOS Docker Hub .
Я не уверен на 100%, в чем заключается решающая проблема, но, похоже, это связано с одним из следующих обстоятельств (все или только некоторые из них нуждаются в исправлении/обходном пути, в котором я не уверен):
- Похоже, невозможно правильно привязать файловую систему cgroup хоста (или, скорее, рабочего Concourse из-за того, что он использует Docker в Docker) в контейнер CentOS, поскольку Concourse не имеет конфигурации для привязки монтирования для задач. Я попытался сгенерировать необходимые файловые системы «с нуля» внутри контейнера, смонтировав tmpfs на
/sys/fs/cgroup
а затем смонтировать файловую систему cgroup с именемsystemd
на/sys/fs/cgroup/systemd
, но я не уверен, должно ли это работать. - Зал использует встроенный
garden-init
двоичный файл в качестве точки входа изображения и PID 1, что приводит к тому, что systemd работает с другим PID. Согласно руководству CentOS, точка входа должна быть , которая является символической ссылкой на/usr/lib/systemd/systemd
Хотя это должно быть возможно с--system
флаг, я все еще не мог заставить все работать полностью.
Я пробовал разные конфигурации задач (запуск через привилегированный
fly execute
с выполнением команд через
bash -exc <command>
) с целью иметь возможность успешно работать, но не смогли этого сделать. Конфигурации, которые я пробовал, и ошибки, которые я получил с ними:
- Запуск с монтированием или без монтирования systemd cgroup с нуля и с запуском команды или без него
exec
приводит к ошибкеCouldn't find an alternative telinit implementation to spawn.
. - Запуск без монтирования systemd cgroup с нуля до того, как приведет к тому, что systemd не запустится с сообщением об ошибке
Cannot find cgroup mount point: No such file or directory
Failed to allocate manager object: No such file or directory
- Бег
/usr/lib/systemd/systemd --system
после монтирования systemd cgroup, как описано, systemd, по-видимому, запускается правильно (вывод такой же, как и при запуске всего за пределами Concourse в соответствии с документацией CentOS), но запуск приводит к ошибкеFailed to get D-Bus connection: Operation not permitted
.
мне удалось получить
systemctl is-system-running
для работы в контейнере runc, созданном вручную, скопировав пакет контейнера, созданный через Concourse/Garden, и отредактировав только точку входа (точнее,
process.args
поле OCI config.json) должно быть
/usr/sbin/init
, так что кажется, что этого достаточно для моих требований. К сожалению, я не знаю, как настроить конвейер, чтобы добиться этого для контейнера, запущенного из контекста Concourse.