docker在启动apache和neo4j后立即退出
我有一个启动apache和neo4j的脚本docker在启动apache和neo4j后立即退出,docker,neo4j,apache2,Docker,Neo4j,Apache2,我有一个启动apache和neo4j的脚本/init。此脚本已在图像ubuntu:14中。以下是/init的内容: service apache2 start service neo4j start 从这个图像中,我创建了另一个具有以下dockerfile的图像 FROM ubuntu:v14 EXPOSE 80 80 ENTRYPOINT ["/init"] 当我运行命令dockerrun-dubuntu:v15时,容器启动然后退出。据我所知,-d选项在后台运行容器。另外,脚本\init启
/init
。此脚本已在图像ubuntu:14
中。以下是/init
的内容:
service apache2 start
service neo4j start
从这个图像中,我创建了另一个具有以下dockerfile的图像
FROM ubuntu:v14
EXPOSE 80 80
ENTRYPOINT ["/init"]
当我运行命令
dockerrun-dubuntu:v15
时,容器启动然后退出。据我所知,-d
选项在后台运行容器。另外,脚本\init
启动两个守护进程容器为什么退出?当Dockerfile指定入口点时,容器的生存期正好是其进程的长度。通常,服务的行为。。。启动
是将服务作为后台进程启动,然后立即返回;因此,您的/init
脚本运行两个服务
命令并完成,现在入口点过程完成,容器退出
通常公认的最佳实践是在一个容器中只运行一个进程。当其中一个进程是数据库时尤其如此。在您的例子中,有标准的Docker Hub和映像,因此我首先使用编排工具,比如并排运行这两个容器。当Docker文件指定入口点时,容器的生命周期正好是其进程的长度。通常,
服务的行为。。。启动
是将服务作为后台进程启动,然后立即返回;因此,您的/init
脚本运行两个服务
命令并完成,现在入口点过程完成,容器退出
通常公认的最佳实践是在一个容器中只运行一个进程。当其中一个进程是数据库时尤其如此。在您的例子中,有标准的Docker Hub和图像,因此我首先使用编排工具,比如并排运行这两个容器。事实上,我认为您的第一个问题是
#如果您没有添加类似于#的内容,请在init
文件中添加code>/bin/bash
在开始时,容器将如下所示:
shubuntu1@shubuntu1:~$ docker logs priceless_tu
standard_init_linux.go:207: exec user process caused "exec format error"
但即使解决了上述问题,您仍然无法启动您的容器,原因与其他人所说的相同:PID 1应始终存在,在您的情况下,在service xxx start
finish之后,PID 1退出也将导致容器退出
因此,要解决此问题,您应该设置一个永不退出的命令,这是一个供您参考的最简单可行的示例:
Dockerfile:
FROM ubuntu:14.04
RUN apt-get update && \
apt-get install -y apache2
COPY init /
RUN chmod +x /init
EXPOSE 80
ENTRYPOINT ["/init"]
#!/bin/bash
# you can add other service start here
# e.g. service neo4j start as you like if you have installed it already
# next will make apache run in foreground, so PID1 not exit.
/usr/sbin/apache2ctl -DFOREGROUND
init:
FROM ubuntu:14.04
RUN apt-get update && \
apt-get install -y apache2
COPY init /
RUN chmod +x /init
EXPOSE 80
ENTRYPOINT ["/init"]
#!/bin/bash
# you can add other service start here
# e.g. service neo4j start as you like if you have installed it already
# next will make apache run in foreground, so PID1 not exit.
/usr/sbin/apache2ctl -DFOREGROUND
事实上,我认为您的第一个问题是#如果您没有添加类似于#的内容,请在init
文件中添加code>/bin/bash
在开始时,容器将如下所示:
shubuntu1@shubuntu1:~$ docker logs priceless_tu
standard_init_linux.go:207: exec user process caused "exec format error"
但即使解决了上述问题,您仍然无法启动您的容器,原因与其他人所说的相同:PID 1应始终存在,在您的情况下,在service xxx start
finish之后,PID 1退出也将导致容器退出
因此,要解决此问题,您应该设置一个永不退出的命令,这是一个供您参考的最简单可行的示例:
Dockerfile:
FROM ubuntu:14.04
RUN apt-get update && \
apt-get install -y apache2
COPY init /
RUN chmod +x /init
EXPOSE 80
ENTRYPOINT ["/init"]
#!/bin/bash
# you can add other service start here
# e.g. service neo4j start as you like if you have installed it already
# next will make apache run in foreground, so PID1 not exit.
/usr/sbin/apache2ctl -DFOREGROUND
init:
FROM ubuntu:14.04
RUN apt-get update && \
apt-get install -y apache2
COPY init /
RUN chmod +x /init
EXPOSE 80
ENTRYPOINT ["/init"]
#!/bin/bash
# you can add other service start here
# e.g. service neo4j start as you like if you have installed it already
# next will make apache run in foreground, so PID1 not exit.
/usr/sbin/apache2ctl -DFOREGROUND
您的脚本是pid 1,当pid 1退出时,容器死亡。尝试跟踪日志或其他引用:您的脚本是pid 1,当pid 1退出时,容器死亡。尝试跟踪日志或其他参考: