我在尝试设置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时,我再也看不到它了。
答案 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。然后让它开始你的过程。