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" \ "$@"
作为替代,您可以使用docker-systemctl-replacement脚本,并将其注册为映像的主CMD。 它将检出* .service脚本来知道如何启动和停止一个服务(没有systemd守护进程的帮助)。 所以如果Grafana家伙改变他们的启动scheme,那么你的构build将继续工作。 ;)