Docker – 进程不在启动时启动

我正在容器化最新版本的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"] 

构buildDockerfile成功,并且不返回任何错误。

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

 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守护进程(我不build议这样做,否则会产生很多问题),你不应该试图用systemctl/etc/init.d命令启动进程。 容器不是虚拟机,它们是在自己的命名空间中运行应用程序的一种方法。 当这个应用程序退出时,你的容器也一样。 当你的应用程序像systemctl start命令一样时,你的容器会在systemctl命令返回的时候退出,这是没有用的,你跳它将保持在grafana进程运行的持续时间。

我不build议重新发明轮子,而是build议你看看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脚本,并将其注册为映像的主CMD。 它将检出* .service脚本来知道如何启动和停止一个服务(没有systemd守护进程的帮助)。 所以如果Grafana家伙改变他们的启动scheme,那么你的构build将继续工作。 ;)