保持Docker容器运行Java应用程序

我试图build立一个Docker容器,以便它保持运行时,经常性的问题。

以下是我想要使用的Dockerfile示例:

RUN wget -O /usr/local/nexus-2.11.3-01-bundle.tar.gz http://www.sonatype.org/downloads/nexus-2.11.3-01-bundle.tar.gz WORKDIR /usr/local RUN tar xvzf /usr/local/nexus-2.11.3-01-bundle.tar.gz RUN ln -s nexus-2.11.3-01 nexus ENV NEXUS_HOME /usr/local/nexus ENV RUN_AS_USER root CMD ["/usr/local/nexus/bin/nexus", "start"] EXPOSE 8081 

基本上,当我build立这个,然后运行它,容器就死了,做一个docker ps命令返回没有正在运行的容器。

据我所知,(如果我错了,请纠正我的错误…)docker容器应该保持运行,只要这些进程的PID为1;以前的命令的使用是否使用PID 1,如果那么,我该如何强制nexus start命令来使用它呢? 或者只是保持容器活着…

docker日志链接的内容给出:

 **************************************** WARNING - NOT RECOMMENDED TO RUN AS ROOT **************************************** Starting Nexus OSS... Started Nexus OSS. 

这似乎表明,Nexus已经开始,但是当我做一个docker ps时,我没有看到它正在运行。

如果运行PID 1的进程退出,则容器将自动停止。 你可以使用Launcher的概念在这里检查sonatype/nexus库。

这是他们如何避免容器退出:

 ... RUN mkdir -p /opt/sonatype/nexus \ && curl --fail --silent --location --retry 3 \ https://download.sonatype.com/nexus/professional-bundle/nexus-professional-${NEXUS_VERSION}-bundle.tar.gz \ | gunzip \ | tar x -C /tmp nexus-professional-${NEXUS_VERSION} \ && mv /tmp/nexus-professional-${NEXUS_VERSION}/* /opt/sonatype/nexus/ \ && rm -rf /tmp/nexus-professional-${NEXUS_VERSION} RUN useradd -r -u 200 -m -c "nexus role account" -d ${SONATYPE_WORK} -s /bin/false nexus ... EXPOSE 8081 WORKDIR /opt/sonatype/nexus USER nexus ENV CONTEXT_PATH / ENV MAX_HEAP 768m ENV MIN_HEAP 256m ENV JAVA_OPTS -server -XX:MaxPermSize=192m -Djava.net.preferIPv4Stack=true ENV LAUNCHER_CONF ./conf/jetty.xml ./conf/jetty-requestlog.xml CMD java \ -Dnexus-work=${SONATYPE_WORK} -Dnexus-webapp-context-path=${CONTEXT_PATH} \ -Xms${MIN_HEAP} -Xmx${MAX_HEAP} \ -cp 'conf/:lib/*' \ ${JAVA_OPTS} \ org.sonatype.nexus.bootstrap.Launcher ${LAUNCHER_CONF} 

由于它是一个开放的仓库,如果你喜欢,你可以直接参考他们的仓库。

从日志中快速猜测,运行/usr/local/nexus/bin/nexus start会启动它作为守护进程。

这会导致另一个进程产生,启动守护进程的进程将退出,终止容器。

一种解决scheme是不作为守护进程启动进程,但是我找不到在联机情况下执行此操作的选项。

另一个是使用像supervisord的东西作为docker的CMD。 然后让它开始你的过程。