Docker - 进程未在启动时启动

Docker - Process not starting at boot

我正在容器化最新版本的 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 成功并且returns没有错误。

当我尝试 运行 此图像时,出现错误。

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 进程。

除非您 运行 在容器内安装您自己的 systemd 守护程序(我不推荐这样做,它会产生很多问题),否则您不应该尝试使用systemctl/etc/init.d 命令。容器不是 VM,它们是 运行 在其自己的命名空间内的应用程序的一种方法。当该应用程序退出时,您的容器也会退出。当您的应用程序类似于 systemctl 启动命令时,您的容器将在 systemctl 命令 returns 时退出,这没有用,因为您希望它会在 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

结束

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