使 Docker 容器保持活动状态 运行 Java 应用程序

Keeping Docker container alive running Java application

我在尝试设置 Docker 容器以使其保持 运行ning 时遇到反复出现的问题。

这是我想要使用的 Docker 文件的示例:

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 命令 returns 没有 运行宁集装箱。

据我所知,(如果我错了请纠正我...)只要有一个 pid 为 1 的进程,docker 容器就应该保持 运行ning . 前面命令的用法是否使用 PID 1,如果是,我如何强制 nexus start 命令使用它?或者只是让容器保持活动状态...

docker 日志 nexus 的内容给出:

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

似乎表明 Nexus 已经启动,但是当我再次执行 docker ps 时,我没有看到它 运行ning。

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

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

一个解决方案是不以守护进程的形式启动该进程,但我在您的 nexus 案例中找不到执行此操作的选项。

另一种方法是使用 supervisord 之类的东西作为 docker 的 CMD。然后让它开始你的过程。

如果进程运行 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}

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