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

时间:2015-07-06 18:08:38

标签: docker containers

我在尝试设置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

基本上当我构建它,然后运行它时,容器就会死掉,并且执行docker ps命令会返回没有正在运行的容器。

据我所知,(请纠正我,如果我错了......)只要有一个pid为1的进程,docker容器应该保持运行。以前命令的使用是否会使用PID 1 ,如果是这样,我如何强制使用nexus start命令?或者只是让容器保持活着......

docker log nexus的内容给出:

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

似乎暗示Nexus已经启动,但是当我做一个docker ps时,我再也看不到它了。

2 个答案:

答案 0 :(得分:2)

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

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

...
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}

由于它是一个开放的存储库,如果您愿意,可以直接引用它们的存储库。

答案 1 :(得分:1)

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

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

一个解决方案是不是作为守护进程启动进程,但是我找不到在你的nexus情况下执行此操作的选项。

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