容器启动时启动服务

3

我尝试在容器启动时运行3个服务(snmpd,sshd和centengine)。

由于容器中未知的运行级别,这些服务将无法启动。

我使用以下Dockerfile构建了一个镜像:

FROM centos:6.7
MAINTAINER nael <me@mail>

# Update CentOS
RUN yum -y update

# Install wget
RUN yum install -y wget

# Get Centreon Repo
RUN wget http://yum.centreon.com/standard/3.0/stable/ces-standard.repo -O /etc/yum.repos.d/ces-standard.repo

# Install Packages (SSH, sudo, Centreon Poller & Engine, SNMP)
RUN yum install -y --nogpgcheck openssh-clients openssh-server centreon-poller-centreon-engine sudo net-snmp net-snmp-utils

# Install supervisord
RUN rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
RUN yum --enablerepo=epel install -y supervisor
RUN mv -f /etc/supervisord.conf /etc/supervisord.conf.org
ADD supervisord.conf /etc/

# For sshd & centengine
EXPOSE 22 5669

# Change user password
RUN echo -e "password" | (passwd --stdin user)

# Disable PAM (causing issues while ssh login)
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
RUN sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config

# Start supervisord
CMD ["/usr/bin/supervisord"]

这是supervisord.conf文件

[supervisord]
nodaemon=true
pidfile=/var/run/supervisord.pid
logfile=/var/log/supervisor/supervisord.log

[program:centengine]
command=service centengine start

[program:snmpd]
command=service snmpd start

[program:sshd]
command=service sshd start

但是,使用这个Dockerfile和supervisord.conf文件时,当我启动容器时,这些服务没有运行。
可能的问题是什么?

和你建议的CMD部分有同样的问题。编辑:刚刚在上面的消息中编辑了CMD部分。 - Nael
我认为 service ... start 在 Docker 容器内不起作用。请参阅 https://dev59.com/IYXca4cB1Zd3GeqPJorW 以了解使用 supervisord 的解决方案。 - Xiongbing Jin
Docker目前不支持服务,需要将/usr/bin/supervisord添加为容器的CMD,并更改supervisord.conf文件以直接运行该二进制文件,而不是使用服务,因为它无法工作。我删除了我的第一条评论,以防在未来混淆读者。 - Xiongbing Jin
无论是使用service ... start还是二进制文件,我在supervisord中始终会遇到“INFO exited: sshd(退出状态为0;不符合预期)”的错误提示。 - Nael
这是我正在使用的。 - Nael
显示剩余3条评论
2个回答

1

不再使用supervisord。

我在Dockerfile中包含了一个带有所有services ... start命令的脚本。当我使用docker run ...创建容器时,我只需指定要使用我的脚本启动它。

& 这非常好用。

感谢@warmoverflow的尝试解决此问题。


0

你可能会发现我的 dockerfy 工具很有用,可以在主命令启动之前启动服务并预运行初始化命令。请参见 https://github.com/markriggins/dockerfy

例如:

RUN wget https://github.com/markriggins/dockerfy/releases/download/0.2.4/dockerfy-linux-amd64-0.2.4.tar.gz; \
    tar -C /usr/local/bin -xvzf dockerfy-linux-amd64-*tar.gz; \
    rm dockerfy-linux-amd64-*tar.gz;


ENTRYPOINT dockerfy 
COMMAND --start bash -c "while false; do echo 'Ima Service'; sleep 1; done" -- \
    --reap -- \
    nginx 

将会以服务方式运行一个 bash 脚本,每秒钟回显 "Ima Service",同时主要命令 nginx 运行。如果 nginx 退出,则 "Ima Service" 脚本将自动停止。

作为附加好处,任何由 nginx 遗留的僵尸进程都将被自动清理。

您还可以 tail 日志文件,例如 /var/log/nginx/error.log 到 stderr,编辑 nginx 的配置并在启动之前执行更多操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接