2017-01-30 3 views
0

Я пытаюсь выполнить HTTP-сервер Grizzly внутри контейнера.Джерси Grizzly HTTP Server shutdown внутри контейнера docker

Моя проблема заключается в том, что когда я запускаю контейнер (используя компоновку докеров), контейнер выключается через несколько секунд.

Вот мой сервер Dockerfile:

FROM alpine:3.5 

MAINTAINER Maybe One <[email protected]> 

# Java Version and other ENV 
ENV JAVA_VERSION_MAJOR=8 \ 
    JAVA_VERSION_MINOR=102 \ 
    JAVA_VERSION_BUILD=14 \ 
    JAVA_PACKAGE=jdk \ 
    JAVA_JCE=standard \ 
    JAVA_HOME=/opt/jdk \ 
    PATH=${PATH}:/opt/jdk/bin \ 
    GLIBC_VERSION=2.23-r3 \ 
    LANG=C.UTF-8 

RUN apk upgrade --update && \ 
    apk add --update libstdc++ curl ca-certificates bash && \ 
    for pkg in glibc-${GLIBC_VERSION} glibc-bin-${GLIBC_VERSION} glibc-i18n-${GLIBC_VERSION}; do curl -sSL https://github.com/andyshinn/alpine-pkg-glibc/releases/download/${GLIBC_VERSION}/${pkg}.apk -o /tmp/${pkg}.apk; done && \ 
    apk add --allow-untrusted /tmp/*.apk && \ 
    rm -v /tmp/*.apk && \ 
    (/usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 C.UTF-8 || true) && \ 
    echo "export LANG=C.UTF-8" > /etc/profile.d/locale.sh && \ 
    /usr/glibc-compat/sbin/ldconfig /lib /usr/glibc-compat/lib && \ 
    mkdir /opt && \ 
    curl -jksSLH "Cookie: oraclelicense=accept-securebackup-cookie" -o /tmp/java.tar.gz \ 
     http://download.oracle.com/otn-pub/java/jdk/${JAVA_VERSION_MAJOR}u${JAVA_VERSION_MINOR}-b${JAVA_VERSION_BUILD}/${JAVA_PACKAGE}-${JAVA_VERSION_MAJOR}u${JAVA_VERSION_MINOR}-linux-x64.tar.gz && \ 
    gunzip /tmp/java.tar.gz && \ 
    tar -C /opt -xf /tmp/java.tar && \ 
    ln -s /opt/jdk1.${JAVA_VERSION_MAJOR}.0_${JAVA_VERSION_MINOR} /opt/jdk && \ 
    if [ "${JAVA_JCE}" == "unlimited" ]; then echo "Installing Unlimited JCE policy" >&2 && \ 
     curl -jksSLH "Cookie: oraclelicense=accept-securebackup-cookie" -o /tmp/jce_policy-${JAVA_VERSION_MAJOR}.zip \ 
     http://download.oracle.com/otn-pub/java/jce/${JAVA_VERSION_MAJOR}/jce_policy-${JAVA_VERSION_MAJOR}.zip && \ 
     cd /tmp && unzip /tmp/jce_policy-${JAVA_VERSION_MAJOR}.zip && \ 
     cp -v /tmp/UnlimitedJCEPolicyJDK8/*.jar /opt/jdk/jre/lib/security; \ 
    fi && \ 
    sed -i s/#networkaddress.cache.ttl=-1/networkaddress.cache.ttl=30/ $JAVA_HOME/jre/lib/security/java.security && \ 
    apk del curl glibc-i18n && \ 
    rm -rf /opt/jdk/*src.zip \ 
      /opt/jdk/lib/missioncontrol \ 
      /opt/jdk/lib/visualvm \ 
      /opt/jdk/lib/*javafx* \ 
      /opt/jdk/jre/plugin \ 
      /opt/jdk/jre/bin/javaws \ 
      /opt/jdk/jre/bin/jjs \ 
      /opt/jdk/jre/bin/orbd \ 
      /opt/jdk/jre/bin/pack200 \ 
      /opt/jdk/jre/bin/policytool \ 
      /opt/jdk/jre/bin/rmid \ 
      /opt/jdk/jre/bin/rmiregistry \ 
      /opt/jdk/jre/bin/servertool \ 
      /opt/jdk/jre/bin/tnameserv \ 
      /opt/jdk/jre/bin/unpack200 \ 
      /opt/jdk/jre/lib/javaws.jar \ 
      /opt/jdk/jre/lib/deploy* \ 
      /opt/jdk/jre/lib/desktop \ 
      /opt/jdk/jre/lib/*javafx* \ 
      /opt/jdk/jre/lib/*jfx* \ 
      /opt/jdk/jre/lib/amd64/libdecora_sse.so \ 
      /opt/jdk/jre/lib/amd64/libprism_*.so \ 
      /opt/jdk/jre/lib/amd64/libfxplugins.so \ 
      /opt/jdk/jre/lib/amd64/libglass.so \ 
      /opt/jdk/jre/lib/amd64/libgstreamer-lite.so \ 
      /opt/jdk/jre/lib/amd64/libjavafx*.so \ 
      /opt/jdk/jre/lib/amd64/libjfx*.so \ 
      /opt/jdk/jre/lib/ext/jfxrt.jar \ 
      /opt/jdk/jre/lib/ext/nashorn.jar \ 
      /opt/jdk/jre/lib/oblique-fonts \ 
      /opt/jdk/jre/lib/plugin.jar \ 
      /tmp/* /var/cache/apk/* 

# Maven 
ENV MAVEN_VERSION 3.3.9 
ENV MAVEN_HOME /usr/lib/mvn 
ENV PATH $MAVEN_HOME/bin:$PATH 

RUN wget http://ftp.fau.de/apache/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz && \ 
    tar -zxvf apache-maven-$MAVEN_VERSION-bin.tar.gz && \ 
    rm apache-maven-$MAVEN_VERSION-bin.tar.gz && \ 
    mv apache-maven-$MAVEN_VERSION /usr/lib/mvn 

# Workspace 
ENV WORKSPACE /home/app/ 

RUN mkdir -p $WORKSPACE 
WORKDIR $WORKSPACE 

COPY . $WORKSPACE    # Copy Server Project 
RUN mvn clean install -DskipTests 

ENTRYPOINT mvn exec:java 

докер-compose.yml

version: '2.1' 
services: 
    server: 
    build: ./server/ 
    ports: 
     - "8080:8080" 

сервер Докер журналы:

... maven... 
[INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ restful.littleapp --- 
Jan 30, 2017 2:10:18 PM org.glassfish.grizzly.http.server.NetworkListener start 
INFO: Started listener bound to [0.0.0.0:8080] 
Jan 30, 2017 2:10:18 PM org.glassfish.grizzly.http.server.HttpServer start 
INFO: [HttpServer] Started. 
Jersey app started with WADL available at http://0.0.0.0:8080/littleapp/application.wadl 
Hit enter to stop it... 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 5.507 s 
[INFO] Finished at: 2017-01-30T14:10:18+00:00 
Jan 30, 2017 2:10:18 PM org.glassfish.grizzly.http.server.NetworkListener shutdownNow 
INFO: Stopped listener bound to [0.0.0.0:8080] 
[INFO] Final Memory: 37M/90M 
[INFO] ------------------------------------------------------------------------ 

Обычно серверу необходимо слушать ...

+0

Я не знаком с Maven, но я предполагаю, что 'mvn exec: java' запускает сервер, но отбрасывает? А затем команду 'mvn' вы вызываете выходы. В этом случае все будет закрыто, потому что, как только начальный процесс выходит, все остальное в контейнере также выходит. Вам может потребоваться настроить «ENTRYPOINT», чтобы запустить что-то еще, что будет работать, а не fork/exit. –

ответ

1

Проблема, вероятно, в том, что ваш основной класс ждет ввода перед остановкой сервера гризли. Поскольку контейнер-докер не запускается в интерактивном режиме, он никогда не будет вводиться в командной строке, а System.in будет завершен. Процесс mvn exec прекращается.

Вы должны найти способ поддерживать работу сервера гризли без ожидания ввода.

Что-то вроде

server.start(); 
Thread.currentThread().join(); // instead of System.in.read(); 

редактировать: кажется, есть решение, как это уже было описано на С.О. grizzly-http-server-should-keep-running, который также включает в себя грациозное завершение работы с помощью shutdownhook.

+1

Большое спасибо! Он отлично работает с shutdownhook: http://stackoverflow.com/questions/14558079/grizzly-http-server-should-keep-running#answer-15391081. – Maybe1