Как включить службу Systemd в док-контейнере openshift/jenkins-1-centos7?

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

На данный момент я получаю следующую ошибку, когда пытаюсь запустить команду «systemctl» в этом контейнере:

Не удалось установить соединение D-Bus: операция не разрешена

Что ожидается. Теперь, в ходе моего исследования, я обнаружил, что если мы используем приведенный ниже файл докера для создания образа, а затем запускаем контейнер, мы должны иметь возможность запускать команды systemctl:

FROM docker.io/openshift/jenkins-1-centos7
MAINTAINER "you" [email protected]
ENV container docker
RUN (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" ]
CMD ["/usr/sbin/init"]

Я получил следующую ошибку

/bin/sh: line 0: [: cryptsetup.target: unary operator expected
rm: cannot remove 'cryptsetup.target': Permission denied
/bin/sh: line 0: [: dev-hugepages.mount: unary operator expected
rm: cannot remove 'dev-hugepages.mount': Permission denied
/bin/sh: line 0: [: dev-mqueue.mount: unary operator expected
rm: cannot remove 'dev-mqueue.mount': Permission denied
...

Я использую пользователя root для запуска команды.

Хотя, если я заменю исходное изображение на обычное изображение Centos

ОТ СЕНТОС:7

Systemd для этого вновь созданного образа (на основе centos) работает нормально.

Есть ли причина этой ошибки? или я не могу создать образ типа systemd поверх данного изображения jenkins-1-centos7?

EDIT: хорошо, поэтому эксперт помог мне понять, что «по умолчанию в Dockerfile вы запускаете команды от имени пользователя root до тех пор, пока вы явно не измените пользователей с помощью директивы USER. Однако, поскольку вы строите образ, который уже внес это изменение, я полагаю, что вы запускаете команды как пользователь Jenkins, а не как пользователь root. Если вы явно переключитесь обратно на root, вы сможете запускать команды».

Итак, новый файл выглядит примерно так:

FROM docker.io/openshift/jenkins-1-centos7
MAINTAINER "you" [email protected]
#ENV container docker

USER root

RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in ; do [ $i ==systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -rf /lib/systemd/system/multi-user.target.wants/;\
rm -rf /etc/systemd/system/.wants/;\
rm -rf /lib/systemd/system/local-fs.target.wants/; \
rm -rf /lib/systemd/system/sockets.target.wants/udev; \
rm -rf /lib/systemd/system/sockets.target.wants/initctl; \
rm -rf /lib/systemd/system/basic.target.wants/;\
rm -rf /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

Оно работает!! Но теперь служба jenkins не запускается, выдавая следующую ошибку: bash-4.2# systemctl status jenkins.service ● jenkins.service - LSB: сервер непрерывной интеграции Jenkins загружен: загружен (/etc/rc.d/init.d /jenkins) Активно: сбой (результат: код выхода) со вторника 18.10.2016 19:45:17 UTC; 5 с назад Документы: man:systemd-sysv-generator(8) Процесс: 95 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=1/FAILURE)

Oct 18 19:45:17 578908315d82 systemd[1]: Starting LSB: Jenkins Continuous Integration Server...
Oct 18 19:45:17 578908315d82 jenkins[95]: /etc/rc.d/init.d/jenkins: line 51: /etc/init.d/functions: No such file or directory
Oct 18 19:45:17 578908315d82 systemd[1]: jenkins.service: control process exited, code=exited status=1
Oct 18 19:45:17 578908315d82 systemd[1]: Failed to start LSB: Jenkins Continuous Integration Server.
Oct 18 19:45:17 578908315d82 systemd[1]: Unit jenkins.service entered failed state.
Oct 18 19:45:17 578908315d82 systemd[1]: jenkins.service failed.

В настоящее время все еще исследует этот...

EDIT2: Итак, я решил проблему когда-то назад, потому что решил использовать отдельный контейнер для запуска всего остального, и этот контейнер jenkins остался нетронутым как есть...


person Akshaya Khare    schedule 14.10.2016    source источник


Ответы (2)


В дополнение к вашей проблеме openshift/jenkins у вас также есть docker issue 7459, в котором указано:

У меня это работает с этим PR #25567 всего с --cap-add SYS_ADMIN.

Однако эта фиксация еще не выпущена в Docker.

person VonC    schedule 15.10.2016
comment
Что ж, спасибо за ваш вклад, но openshift origin на данный момент поддерживает версию докера 1.10. Так что, очевидно, я не смогу использовать этот пиар. - person Akshaya Khare; 18.10.2016
comment
Решение проблемы с докером 7459 состоит в том, чтобы создать новый образ с заданными шагами в файле докера, мой вопрос в том, почему я не могу использовать те же шаги для создания образа, похожего на образ jenkins-1-centos7 с включенным systemd. . - person Akshaya Khare; 18.10.2016
comment
@AkshayaKhare Я понимаю. Docker 1.10 может не поддерживать это. - person VonC; 18.10.2016

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

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

person Guido U. Draheim    schedule 02.02.2019