Docker CentOS systemctl не разрешен - PullRequest
       39

Docker CentOS systemctl не разрешен

0 голосов
/ 10 октября 2018

Я пытаюсь создать образ CentOS с помощью команды systemctl.Но каждый раз когда я его строю .Я получаю эту ошибку:

Step 5/7 : RUN systemctl enable syslog-ng ; systemctl start syslog-ng
 ---> Running in 8f5a357895e7
Failed to get D-Bus connection: Operation not permitted
The command '/bin/sh -c systemctl enable syslog-ng ; systemctl start syslog-ng' returned a non-zero code: 1

Мой Dockerfile:

FROM centos_systemctl:latest 

RUN yum -y update
RUN yum -y install epel-release ; \
    yum -y install vim ; \
    yum -y install wget ; \
    yum -y install rsync ; \
    yum -y groupinstall "Development tools"
# Install syslog-ng 3.14
RUN cd /etc/yum.repos.d/ ; \
    wget https://copr.fedorainfracloud.org/coprs/czanik/syslog-ng314/repo/epel-7/czanik-syslog-ng314-epel-7.repo ; \
    yum -y install syslog-ng
RUN systemctl enable syslog-ng ; systemctl start syslog-ng
RUN yum -y remove rsyslog
# COPY config syslog-ng
CMD ["/usr/sbin/init"]

centos_systemctl:latest в соответствии с этим: https://github.com/docker-library/docs/tree/master/centos#systemd-integration

Кто-то знает, что я делаю неправильно?

Спасибо,

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Инструмент systemctl в CentOS 7 и более поздних версиях сам по себе ничего не сделает, он просто свяжется с демоном systemd по PID 1. Для этого он использует соединение dbus - и это является причиной ошибки, которую вы видите.

Если вы действительно хотите использовать классический sbin / init, вам следует установить пакет initscripts перед этим.Если вы хотите обеспечить большую совместимость с инструкциями по установке для реальной системы, вы можете также заменить systemctl на инструмент, который работает без демона systemd, например, docker-systemctl-replace , который также ставиткак CMD, чтобы служить init-демоном, который запускает все включенные сервисы в правильном порядке.

0 голосов
/ 17 апреля 2019

Полезно запустить настоящую систему инициализации в докере.Он берет на себя всю работу по докеризации, ведение журнала работает правильно, а CMD всегда может быть просто / sbin / init.У меня была та же проблема, что и у вас, systemctl не работал, и служба, похоже, вообще не запускалась при следовании документам centos.

Попробуйте игнорировать рекомендации по удалению всех системных блоков перед запуском контейнера,как в https://github.com/dholth/vagrant-docker

Интересно, что требуется?

0 голосов
/ 10 октября 2018

Вы должны предположить, что systemd и systemctl просто не работают в Docker, и найти другой подход к вашим целям более высокого уровня.Рекомендуется запускать один сервис и один сервис только в контейнере Docker и использовать несколько контейнеров, если вам нужно несколько координирующих сервисов;если вам действительно нужно запустить несколько вещей в одном и том же контейнере, то supervisord - это обычный диспетчер процессов.

Самая большая проблема с systemd в Docker заключается в том, что по умолчанию он хочет контролировать много вещей,Посмотрите на рисунок на домашней странице systemd : он хочет выполнить настройку на уровне ядра, управлять файловыми системами и запустить несколько сервисов, которые все уже выполнены на хосте и не нужны вКонтейнер Docker.«Простой» способ запуска systemd в Docker заключается в предоставлении ему разрешения на перенастройку вашего хоста;ссылка, которую вы предоставляете, имеет «сложный» способ, который включает в себя удаление большинства ее управляющих файлов.

В контексте Dockerfile также существует проблема, заключающаяся в том, что каждая строка RUN начинается с чистого листа без процессов, запущенных вообще.Так что ваша команда systemctl start ... не работает, потому что не запущен systemd init;и даже если это произойдет, когда эта команда RUN завершится, процесс завершится, и служба не будет работать на следующей строке.

Возможно, вы сможете найти готовый syslog-ngimage , набрав "syslog" в поле поиска на https://hub.docker.com,, что позволит избежать этой проблемы.Он также может работать для установки syslog-ng на базе CentOS, как и вы, но полностью пропустите systemd и просто запустите службу в качестве основной команды, которую образ запускает

CMD ["syslog-ng", "-F"]
...