Невозможно запустить systemd внутри докера, который запускается внутри jenkins - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь заставить Дженкинса запустить Docker, который запускает SystemD .

Пока Я смог запустить systemd внутри Docker локально без Дженкинса ,Вот шаги, чтобы запустить его локально без jenkins:

# pull unop/fedora-systemd and create and run the container for it
sudo docker run --cap-add=SYS_ADMIN -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -t -i unop/fedora-systemd

# on a different terminal window, I can:
# get the container id of the "unop/fedora-systemd" image
sudo docker ps

# then exec bash on it
sudo docker container exec -t -i a98aa2bcd19e bash # where a98aa2bcd19e is the container id found above

# once inside the container, I can run systemd without any problems. examples:
systemctl status
systemctl start dbus.service
systemctl status dbus.service

Выше работает локально, и я могу запустить systemd внутри док-контейнера.Проблема в том, что я пытаюсь сделать то же самое, но внутри Jenkins.

Я несколько раз пытался настроить Jenkinsfile, но мои предыдущие попытки, похоже, не сработали.Я всегда получаю ошибку при работе под Jenkins , похожую на эту:

+ systemctl status
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

Это мой последний Jenkinsfile , который я пробовал

pipeline {
    agent {
        docker {
            image 'unop/fedora-systemd'
            args '--cap-add=SYS_ADMIN -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -t -i'
        }
    }

    stages {
        stage('test') {
            steps {
                sh "echo hello world"
                sh "systemctl status"
                sh "systemctl start dbus.service"
                sh "systemctl dbus.service"
            }
        }
    }
}

На предыдущих итерациях Jenkinsfile я пытался заменить -cap-add=SYS_ADMIN -e container=docker на --privileged, но это не помогло, у меня все те же ошибки

У кого-нибудь есть идеякак я могу заставить это работать?Почему вышеупомянутое работает локально, но не на Дженкинсе?что мне здесь не хватает?

Примечание: версия Jenkins: 2.150.2 и это Dockerfile , используемый unop / fedora-systemd

FROM fedora:rawhide
MAINTAINER http://fedoraproject.org/wiki/Cloud

ENV container docker

RUN dnf -y update && dnf clean all

RUN dnf -y install systemd && dnf clean all && \
(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;

VOLUME [ "/sys/fs/cgroup", "/tmp", "/run" ]
CMD ["/usr/sbin/init"]

PS: я видел связанный вопрос , но то, что они спрашивали, отличается

1 Ответ

0 голосов
/ 02 февраля 2019

Я не знал о связанном вопросе.Позвольте мне еще раз подчеркнуть, что вам не нужно запускать демон systemd в контейнере, контролируемом systemd, если речь идет о запуске нескольких служб в нем.Просто перезапишите /usr/bin/systemctl с помощью сценария docker-systemctl-replace .Затем зарегистрируйте его в CMD ["/usr/bin/systemctl"] как процесс инициализации контейнера.

Вот и все.Теперь вы можете запустить любой процесс systemctl-start из операционной системы.Это работает до такой степени, что даже предоставление сценариев ansible / puppet не имеет никаких проблем.В частности, я использую это для обеспечения образов Jenkins операционной системой, которую разработчики хотели бы использовать в качестве основы.Привилегированный режим не требуется.

...