Dockerized Java应用程序死机,没有错误消息,但运行良好的独立

时间:2018-03-07 17:53:17

标签: java docker

请注意:知道此问题与this one非常相似,但您会注意到该案例中的解决方案是{{1}我正在做的端口。因此,尽管这些问题听起来相似,但我认为它只是一个与其他问题类似的症状的完全不同的问题。

Docker版本17.12.0-ce-mac49(21995)。我是第一次尝试使用Docker并构建了我的第一个Docker镜像。我的EXPOSE是:

Dockerfile

我通过以下方式构建它:

FROM openjdk:8

RUN mkdir /opt/myapp

ADD build/libs/myapp.jar /opt/myapp
ADD application.yml /opt/myapp
ADD logback.groovy /opt/myapp
WORKDIR /opt/myapp
EXPOSE 9200
ENTRYPOINT java -Dspring.config=. -jar myapp.jar

一切都成功了。然后我标记它就好像我要把它推到Quay:

docker build -t myapp .

然而,在我发布到Quay之前,我想在本地运行它以确保它有效:

docker tag <imageId> quay.io/myregistry/myapp:0.1.0-SNAPSHOT

当我运行这个时,我得到一个容器正在运行的迹象,我甚至可以通过docker run -it -p 9200:9200 -d --env-file /Users/myuser/myapp-local.env --name myapp myapp 看到它几秒钟:

docker ps

然而,几秒钟后它停止运行并完全从CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f3fa8f7a4288 myapp "/bin/sh -c 'java -D…" Less than a second ago Up 7 seconds 0.0.0.0:9200->9200/tcp myapp 消失:

docker ps

此外,我无法通过SSH进入容器:

CONTAINER ID        IMAGE               COMMAND                  CREATED                  STATUS              PORTS                    NAMES

...或查看任何日志/控制台输出。

当我在Docker之外运行docker exec -it f3fa8f7a4288 bash Error: No such container: f3fa8f7a4288 时(作为一个典型的Spring Boot应用程序,它启动并运行良好,没有例外)。 如何解决正在发生的事情?

2 个答案:

答案 0 :(得分:1)

如果我没有弄错的话,您遇到的问题是因为您使用的是ENTRYPOINT shell 形式。将其更改为使用 exec 版本,如下所示:

ENTRYPOINT ["java", "-Dspring.config=.", "-jar", "myapp.jar"]

shell表单将像shell命令一样将Java作为单独的进程启动。这会导致PID 1返回,使Docker相信容器已完成。使用exec表单,Java进程替换PID 1,容器将继续运行。

答案 1 :(得分:1)

docker logs命令将显示容器在分离运行时生成的输出(使用-d)。这可能包括错误消息。

docker logs --tail 50 --follow --timestamps container

您可以在没有-d的情况下在前台运行图像,以便在Docker之外运行myapp.jar时看到输出。

docker run my/image

所以在这个具体案例中:

docker run -it -p 9200:9200 --env-file /Users/myuser/myapp-local.env --name myapp myapp