Запуск / usr / sbin / init в Dockerfile вместе с salt-master - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь запустить /usr/sbin/init в сценарии оболочки, но он никогда не выполняется.Я попробовал упомянутое решение здесь , но оно не сработало или, возможно, я что-то делаю не так.Сообщение об ошибке из журналов контейнера: Couldn't find an alternative telinit implementation to spawn. Вот мой Dockerfile

FROM centos
RUN yum install -y epel-release && \
yum install -y --nogpgcheck https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm && \
yum update -y && \
yum install -y virt-what salt-master salt-api vim && \
yum clean all && \
rm -rf /var/cache/yum


COPY extras/netapi.conf /etc/salt/master.d/
COPY entrypoint-master.sh /entrypoint-master.sh

RUN yum -y install systemd; yum 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” ]

EXPOSE 4505/tcp
EXPOSE 4506/tcp
EXPOSE 8080/tcp
CMD ["/entrypoint-master.sh"]

А вот мой entrypoint скрипт

#!/bin/bash

set -e

/usr/sbin/init

# Start the first process
/usr/bin/salt-master -d -l debug
status=$?
if [ $status -ne 0 ]; then
  echo "Failed to start salt-master: $status"
  exit $status
fi

# Start the second process
/usr/bin/salt-api -d -l debug
status=$?
if [ $status -ne 0 ]; then
  echo "Failed to start salt-api: $status"
  exit $status
fi

# Naive check runs checks once a minute to see if either of the processes exited.
# This illustrates part of the heavy lifting you need to do if you want to run
# more than one service in a container. The container exits with an error
# if it detects that either of the processes has exited.
# Otherwise it loops forever, waking up every 60 seconds

while sleep 60; do
  ps aux |grep salt-master |grep -q -v grep
  PROCESS_1_STATUS=$?
  ps aux |grep salt-api |grep -q -v grep
  PROCESS_2_STATUS=$?
  # If the greps above find anything, they exit with 0 status
  # If they are not both 0, then something is wrong
  if [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]; then
    echo "One of the processes has already exited."
    exit 1
  fi
done

exec "$@"

Может кто-нибудь подсказать, пожалуйста, как я могу это исправить.Благодарю.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

«Нормальная» настройка Docker - вообще не запускать систему инициализации или запускать чрезвычайно легкую инициализацию, такую ​​как tini , а затем запускать любую службу в качестве процесса переднего плана.Обратной стороной этого является то, что это означает запуск только одного процесса / службы в контейнере, на переднем плане .В принципе, у вас уже есть все части здесь.

Для мастера Salt я бы удалил специальный сценарий точки входа и уменьшил Dockerfile до:

FROM centos:7
RUN yum install -y epel-release && \
    yum install -y --nogpgcheck https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm && \
    yum update -y && \
    yum install -y virt-what salt-master && \
    yum clean all && \
    rm -rf /var/cache/yum
EXPOSE 4505 4506
CMD ["salt-master", "-l", "debug"]

и аналогично дляконтейнер сервера netapi.Я мог бы использовать Docker Compose для управления двумя связанными контейнерами.

Если вы действительно хотите придерживаться systemd (и его различных несовпадений с Docker), все инструкции по установке Salt Stack предполагают, что он поставляется с собственным модулемфайлы, и поэтому я позволю systemd управлять загрузкой для вас.Когда вы удаляете все конфигурации systemd по умолчанию, сделайте это перед установкой двух серверов Salt, чтобы при их установке установились их файлы модулей из RPM.Затем вы можете снова пропустить файл пользовательской точки входа и CMD ["/usr/sbin/init"].

0 голосов
/ 28 декабря 2018

Попробуйте удалить раздел init и вместо проверки доступности процесса с помощью ps output используйте инструкцию HEALTHCHECK, чтобы проверить, запущена ли служба, и перезапустить контейнер, если он работает (/ usr / bin / python / usr / bin / salt-master -d) не прослушивает порт или дает ожидаемый ответ.

Для запуска systemd должна быть запущена d-bus.Поэтому, если это абсолютно необходимо, используйте некоторые конкретные базовые образы с некоторой системой инициализации, например phusion / baseimage - обычно они этого не сохраняют.

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

[root@0ef85a95d843 /]# /usr/bin/salt-api -d -l debug
[DEBUG   ] Reading configuration from /etc/salt/master
[DEBUG   ] Including configuration from '/etc/salt/master.d/netapi.conf'
[DEBUG   ] Reading configuration from /etc/salt/master.d/netapi.conf
[DEBUG   ] Missing configuration file: /root/.saltrc
[DEBUG   ] Configuration file path: /etc/salt/master
[root@0ef85a95d843 /]# ps auxwf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       253  0.0  0.0  11820  1900 pts/0    Ss   10:17   0:00 /bin/bash
root       360  0.0  0.0  51736  1708 pts/0    R+   10:18   0:00  \_ ps auxwf
root         1  0.0  0.0  11680  1360 ?        Ss   10:16   0:00 /bin/bash /entrypoint-master.sh
root        15  0.0  0.2 214840 23628 ?        S    10:16   0:00 /usr/bin/python /usr/bin/salt-master -d -l debug
root        16  0.4  0.3 306288 29800 ?        Sl   10:16   0:00  \_ /usr/bin/python /usr/bin/salt-master -d -l debug
root        17  0.0  0.2 296768 23376 ?        Sl   10:16   0:00  \_ /usr/bin/python /usr/bin/salt-master -d -l debug
root        18  0.0  0.3 296768 24392 ?        Sl   10:16   0:00  \_ /usr/bin/python /usr/bin/salt-master -d -l debug
root        19  0.0  0.2 214840 22820 ?        S    10:16   0:00  \_ /usr/bin/python /usr/bin/salt-master -d -l debug
root        23  1.1  0.3 959776 27912 ?        Sl   10:16   0:00      \_ /usr/bin/python /usr/bin/salt-master -d -l debug
root        24  1.1  0.3 959776 27836 ?        Sl   10:16   0:00      \_ /usr/bin/python /usr/bin/salt-master -d -l debug
root        27  1.1  0.3 959776 27864 ?        Sl   10:16   0:00      \_ /usr/bin/python /usr/bin/salt-master -d -l debug
root        32  1.1  0.3 959776 27848 ?        Sl   10:16   0:00      \_ /usr/bin/python /usr/bin/salt-master -d -l debug
root        33  1.1  0.3 959776 27904 ?        Sl   10:16   0:00      \_ /usr/bin/python /usr/bin/salt-master -d -l debug
root        34  0.0  0.2 591696 23332 ?        Sl   10:16   0:00      \_ /usr/bin/python /usr/bin/salt-master -d -l debug
root        67  0.0  0.0   4360   360 ?        S    10:16   0:00 sleep 40m

Процесс запускается и его можно увидеть в выводе ps, но он находится в режиме Sl (многопоточный процесс в режиме прерывистого сна).Так что вам нужен процесс, который будет продолжать работать.Мне удалось подключить контейнер только, так как я добавил сон в конце.Попробуйте мастер соли-единства, чтобы запустить мастер, который продолжает работать, просто получите одно предупреждение

[WARNING ] Although 'dmidecode' was found in path, the current user cannot execute it. Grains output might not be accurate.

посмотрите, работает ли это для вас.

...