【问题标题】:Docker error when containerizing a spring boot app容器化 Spring Boot 应用程序时出现 Docker 错误
【发布时间】: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

【问题讨论】:

    标签: docker spring-boot gradle docker-compose dockerfile


    【解决方案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 容器你的应用程序。

    【讨论】:

    猜你喜欢
    • 2021-11-27
    • 2020-01-06
    • 2019-01-01
    • 2021-01-02
    • 2020-02-07
    • 2020-03-03
    • 2021-12-18
    • 2021-11-29
    • 2018-12-07
    相关资源
    最近更新 更多