与Salt-master一起在Dockerfile中运行/ usr / sbin / init

时间:2018-12-28 07:44:22

标签: docker dockerfile salt-stack

我正在尝试在Shell脚本中运行/usr/sbin/init,但是它从未执行。我尝试了提及here的解决方案,但是该解决方案无效,或者我做错了什么。 来自容器日志的错误消息: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 :(得分:0)

尝试删除init部分,而不是使用ps输出检查进程的可用性,请使用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(可中断睡眠中的多线程进程)中。因此,您需要一些可以继续运行的过程。我只能在最后添加睡眠的情况下才能连接容器。尝试使用Salt-unity master来启动它继续运行的master,只得到一个警告

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

看看这是否适合您。

答案 1 :(得分:0)

“正常”的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"]