容器化 Spring Boot 应用程序时出现 Docker 错误

Posted

技术标签:

【中文标题】容器化 Spring Boot 应用程序时出现 Docker 错误【英文标题】:Docker error when containerizing a spring boot app 【发布时间】:2019-01-14 23:12:02 【问题描述】:

我在我的项目中创建了以下 Dockerfile 来容器化 Spring 应用程序

FROM java:8

EXPOSE 8080

VOLUME /tmp

ADD ./spring-boot-app.jar /app/app.jar

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]

无论我是否尝试在 ADD ./spring-boot-app.jar /app/app.jar 中提供 jar 文件的完整项目路径,它仍然会导致以下错误-

任务“:buildDocker”执行失败。 Docker 执行失败 命令行 [docker build -t spring-boot-app:latest /Users/sh/temp/service/build/docker] 返回: 添加失败:stat /var/lib/docker/tmp/docker-builder448261255/spring-boot-app.jar:没有这样的文件或目录

另外,如果有更简单的方法或替代解决方案,感谢您的建议。

基于cmets,我在Dockerfile中尝试了这个,并且能够通过之前的错误:

FROM openjdk:8-jre-alpine
ADD build/libs/*.jar app.jar
ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar

但是在运行命令 docker-compose up 时,它没有将 spring boot 应用程序容器与 mysql 容器链接,并给出通信链接失败错误。这可能是因为 Dockerfile ENTRYPOINT。这是 docker-compose.yml :

version: '3'

services:
  demo-mysql:
    image: mysql:latest
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: smthing
      MYSQL_DATABASE: smthing
      MYSQL_USER: smthing
      MYSQL_PASSWORD: smthing
  spring-boot-docker-webapp:
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      - demo-mysql
    ports:
      - 8080:8080
    environment:
      DATABASE_HOST: demo-mysql
      DATABASE_USER: smthing
      DATABASE_PASSWORD: smthing
      DATABASE_NAME: smthing
      DATABASE_PORT: 3306

【问题讨论】:

【参考方案1】:

基本上你的 jar 的路径是错误的,但这里有一些稍微不同的说明。确保您的 Dockerfile 位于根存储库中(在 pom.xml 旁边),并且您已将项目打包到一个 jar 中(它将被放入目标文件夹中)。然后尝试这些行而不是您的 ADD 行(显然将“YOUR-APP”替换为您的应用名称):

# The application's jar file
ARG JAR_FILE=target/YOUR-APP-0.0.1-SNAPSHOT.jar

# Add the application's jar to the container
ADD $JAR_FILE YOUR-APP.jar

#Then replace the run line with

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/YOUR- 
APP.jar"]

【讨论】:

嗨 Daisy,Dockerfile 已经在 root repo 中的 build.gradle 的同一级别。我不确定这里的目标文件夹是什么意思,默认情况下,我的 jar 文件在编译项目时在 /build/libs 中生成。【参考方案2】:

好的,您现在似乎已经前进了一点,这已成为另一个问题。如果您想从 Spring Boot 应用程序与 mysql 通信,则需要将它们放在网络上。您可以在 docker compose 文件中的任何位置声明网络(我喜欢在底部进行),但是对于每个服务,您需要将服务添加到该网络。然后,您需要为您的 Spring 引导服务设置一个环境变量 = mysql 容器的容器名称。在你的情况下,mysql-demo。您需要更新 Spring Boot 项目中的 application.properties 以接受该变量,例如

MYSQL_HOST=本地主机 spring.datasource.url=jdbc:mysql://$MYSQL_HOST/YOUR-DB-NAME

这样,您的应用程序将默认为 localhost,除非您将环境变量传入,您将从 docker compose 文件中执行此操作,这将告诉您的应用程序指向您放置在同一网络上的 mysql 容器你的应用程序。

【讨论】:

这里有一些关于 docker compose 网络的更多信息:docs.docker.com/compose/networking/#specify-custom-networks

以上是关于容器化 Spring Boot 应用程序时出现 Docker 错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥在尝试将 Hibernate Spatial 用于 Spring Boot 项目时出现此错误?实例化异常

Spring Boot,Java,Docker Compose,尝试在两个容器(mysql,my-api)之间建立连接时出现“连接被拒绝”

在 Docker 中部署 Spring Boot 和 Angular 应用程序时出现 CORS 错误

运行Spring Boot APP时出现Spring Boot问题

设置 SSL 连接时出现 Spring Boot 错误

为啥在启动 Spring Boot 应用程序时出现 Gson builder 错误?