【问题标题】:Docker - Process not starting at bootDocker - 进程未在启动时启动
【发布时间】:2017-08-28 22:08:29
【问题描述】:

我正在容器化最新版本的 grafana,并希望在容器启动时启动 grafana-process,然后在我的 K8S (kubernetes) 集群中使用它。

我的 Dockerfile 看起来像:

FROM armdocker/baseimages/rhel:7-20161207
MAINTAINER xxxxxxxx

ENV GRAFANA_VERSION_MAJOR=4 GRAFANA_VERSION_MINOR=4 GRAFANA_VERSION_PATCH=3-1
ENV GRAFANA_VERSION=${GRAFANA_VERSION_MAJOR}.${GRAFANA_VERSION_MINOR}.${GRAFANA_VERSION_PATCH}

RUN yum clean all && yum install -y unzip tar

RUN curl  -f -L -o grafana-${GRAFANA_VERSION}.x86_64.rpm https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-${GRAFANA_VERSION}.x86_64.rpm && \
    yum localinstall grafana-${GRAFANA_VERSION}.x86_64.rpm -y

EXPOSE 3000
ENTRYPOINT ["/etc/init.d/grafana-server start"]

构建 Dockerfile 成功并且没有返回错误。

当我尝试运行这个图像时,我得到了错误。

docker run -dit -p 3000:3000 armdocker/proj/grafana:1.0.5
471b2acb964caad69bbb78831a59ee9d2b27997911b5b104b0057ddc957d1101
Error response from daemon: Cannot start container 471b2acb964caad69bbb78831a59ee9d2b27997911b5b104b0057ddc957d1101: [8] System error: exec: "/etc/init.d/grafana-server start": stat /etc/init.d/grafana-server start: no such file or directory

这似乎很奇怪,因为我首先安装了 RPM(这使得文件 /etc/init.d/grafana-server )然后我试图以我的 ENTRYPOINT 开始该过程

然后我尝试了

CMD ["/etc/init.d/grafana-server start"]

这也会导致同样的错误/etc/init.d/grafana-server start: no such file or directory

然后我尝试使用systemctl 命令:

docker run -dit -p 3000:3000 armdocker/proj/grafana:1.0.6
bfd492c75a0f4c284fc0fdbd5a590f0155f6f67bcb4834e144f344bb789546f3
Error response from daemon: Cannot start container bfd492c75a0f4c284fc0fdbd5a590f0155f6f67bcb4834e144f344bb789546f3: [8] System error: exec: "/bin/systemctl start grafana-server.service": stat /bin/systemctl start grafana-server.service: no such file or directory

我不知道我做错了什么让容器启动了 grafana 进程。

【问题讨论】:

  • ENTRYPOINT ["/etc/init.d/grafana-server"] CMD ["start"]

标签: docker containers grafana


【解决方案1】:

除非您在容器内运行自己的 systemd 守护进程(我不推荐这样做,它会产生很多问题),否则您不应该尝试使用 systemctl/etc/init.d 启动进程命令。容器不是虚拟机,它们是在自己的命名空间中运行应用程序的一种方法。当该应用程序退出时,您的容器也会退出。当您的应用程序类似于systemctl start 命令时,您的容器将在 systemctl 命令返回的那一刻退出,这没有用,因为您希望它会在 grafana 进程运行期间保持运行。

与其尝试重新发明*,我建议您看看 grafana 自己如何打包他们的 docker 容器。具体来说,他们的 run.sh 以:

结尾
exec gosu grafana /usr/sbin/grafana-server      \
  --homepath=/usr/share/grafana                 \
  --config=/etc/grafana/grafana.ini             \
  cfg:default.log.mode="console"                \
  cfg:default.paths.data="$GF_PATHS_DATA"       \
  cfg:default.paths.logs="$GF_PATHS_LOGS"       \
  cfg:default.paths.plugins="$GF_PATHS_PLUGINS" \
  "$@"

他们的回购在https://github.com/grafana/grafana-docker结束了

【讨论】:

    【解决方案2】:

    作为替代方案,您可以使用docker-systemctl-replacement script 并将其注册为图像的主 CMD。它将检查 *.service 脚本以了解如何启动和停止服务(无需 systemd 守护程序的帮助)。因此,如果 Grafana 人改变了他们的启动方案,那么您的构建将继续工作。 ;)

    【讨论】: