我正在尝试在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 "$@"
有人可以建议我如何解决它。谢谢。
答案 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"]
。