请注意:我知道此问题与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应用程序,它启动并运行良好,没有例外)。 如何解决正在发生的事情?
答案 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