【问题标题】:Docker Container not running for spring boot applicationDocker 容器未针对 Spring Boot 应用程序运行
【发布时间】:2018-08-16 08:44:09
【问题描述】:

我是 docker 新手。我正在尝试使用 docker 运行我的应用程序。但是,当我尝试在容器上运行 exec -it /bin/bash 命令时,它会引发错误 错误:

Error response from daemon: Container is not running

Following is my docker file (Dockerfile):
FROM openjdk:8-jdk-alpine
EXPOSE 8080
VOLUME /tmp
ADD /target/entertainment-0.0.1-SNAPSHOT.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

接下来的步骤:

  1. docker build -t 娱乐服务。

  2. docker 镜像,获取镜像 id

  3. docker 运行命令:docker run -d imageId

  4. 使用邮递员点击 localhost:8080/entertainment - 无法获得响应,连接错误

  5. docker exec -it container-id /bin/bash

来自守护进程的错误响应:容器未运行

知道 Dockerfile 有什么问题吗?

第一次更新:

更新 docker 文件

FROM java:alphine
EXPOSE 8198 - same port used in qa32 properties file
VOLUME /tmp
WORKDIR  /srv
ADD /target/entertainment-0.0.1-SNAPSHOT.jar /srv/
CMD java -jar entertainment-0.0.1-SNAPSHOT.jar

我遇到了同样的问题。当我尝试使用手动 java 命令从目标运行 jar 时,它可以工作。不知道这里有什么问题。

第二次更新:

运行时出现休眠错误

Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
    at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:100) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]
    at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:54) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:137) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:254) ~[hibernate-core-5.0.12.Final.jar!/:5.0.12.Final]
    ... 41 common frames omitted

我得到了堆栈

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_151]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_151]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_151]

【问题讨论】:

  • 我的 docker 容器在启动后几秒钟内就死掉了。我可以在任何地方看到日志吗?
  • 不带 -d 运行即可查看输出。
  • 谢谢。我收到错误“原因:org.hibernate.HibernateException:当'hibernate.dialect'未设置时,对DialectResolutionInfo的访问不能为空”。不知道为什么我在使用 Docker 运行时会得到这个。我确实在 application.properties 文件中提到了 mysql 连接器和依赖项。我还尝试使用 --env 运行指向文件的 docker
  • 现在问题已缩小到 Hibernate 而不是 docker。检查您在 pom 中的配置和依赖关系,了解问题的根本原因。

标签: mysql hibernate docker spring-boot dockerfile


【解决方案1】:

在add命令后去掉/,像这样

ADD target/entertainment-0.0.1-SNAPSHOT.jar app.jar

路径被视为相对于 docker 文件,因此 / 可能会导致问题。 此外 docker run 命令需要更改以映射主机和容器之间的端口。

如果使用虚拟盒子,还要确保你已经创建了端口转发规则。

对于第二个问题,请查看question

如果您想学习 docker,请查看此repo

【讨论】:

  • 也没有用。使用 docker 运行时出现休眠错误。粘贴在一般评论中
【解决方案2】:

看起来应用无法从 docker 容器联系到 db。如果您使用的是外部数据库,如 mysql,则需要在容器和外部 mysql 之间建立链接。

一种方法是将 mysql 容器和 app 容器放在同一个网络中。

  1. 创建网络 - docker network create sample-network
  2. 创建 mysql 容器 - docker create --network sample-network --name mysql-container -e MYSQL_ROOT_PASSWORD=root mysql --max-connections=300 --max-connect-errors=10000
  3. 创建应用容器 - docker create --network sample-network --name your_app_name app_image_name_here
  4. 使用 - docker start mysql-container your_app_name 启动 mysql 和您的应用程序

【讨论】:

  • 嗨。我按照步骤操作。我有一个问题,我的 app_name 是否也应该在 docker 文件中提及?执行完这些步骤后,我看到容器为 sql 和我的应用程序都站起来了。但是,几秒钟后,我的应用程序容器停止了。如何在上述步骤中启动不在后台的容器以查看错误?
  • 不,您不需要在 docker 文件中提及应用名称。它仅供您参考,以便您知道哪个容器正在运行您的应用程序。要检查日志,您不必在前台启动容器。你可以通过命令'docker logs '来做到这一点
  • @YogeshBadke 你好,我试过你的答案。我的 MySQL 容器正在运行。但是我的应用程序自动退出,退出代码为 1。你知道如何解决这个问题吗?
猜你喜欢
  • 2018-07-11
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 2015-11-19
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多