【问题标题】:Starting services at container startup在容器启动时启动服务
【发布时间】:2016-09-08 12:38:14
【问题描述】:

我正在尝试在容器启动时运行 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 部分。
  • 我认为service ... start 在 Docker 容器中不起作用。使用supervisord的解决方案见stackoverflow.com/questions/27154567/…
  • 用 supervisord 更新了我的 conf,仍然无法正常工作。我仍然在我的 supervisord.conf 中使用service ... start 但这应该不是问题(我找到该文件示例的帖子正在使用此命令)我会尝试找到一种方法来运行服务前台作为大多数supervisord.conf使用这种类型的开始:command=/usr/sbin/sshd -D
  • 我认为我的/usr/bin/supervisord 不是从容器开始的。当我启动容器时,服务没有启动。如果我手动启动/usr/bin/supervisord,那么服务就会启动。
  • 再一次,Docker 不支持我现在理解的服务。您需要添加 /usr/bin/supervisord 作为容器的 CMD,并且您需要更改您的 supervisord.conf 文件以直接运行二进制文件而不是使用服务,因为它不起作用。我删除了我的第一条评论,以防将来可能会混淆人们。

标签: service docker centos startup dockerfile


【解决方案1】:

您可能会发现我的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 服务”,同时主命令 nginx 运行。如果 nginx 退出,那么“Ima Service”脚本将自动停止。

另外一个好处是,任何被 nginx 遗留下来的僵尸进程都会被自动清理掉。

您还可以将 /var/log/nginx/error.log 等日志文件拖尾到 stderr,在启动之前编辑 nginx 的配置等等

【讨论】:

    【解决方案2】:

    不再使用 supervisord。

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

    & 效果很好。

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

    【讨论】:

      猜你喜欢
      • 2016-12-16
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多