docker-compose启动jar找不到properties

img


docker-compose 启动jar项目启动完成后访问接口提示找不到配置文件 但是实际jar下面 是有这个文件的

img


windows 启动没有问题 但是linux启动就有问题 这个配置文件实在jar里面的

img


看了源码 应该是这一行读取路径的问题
我看linux直接从jar去读取的文件 是应该在什么地方修改这个启始路径 会不会是配置文件的问题

img

你可以使用docker-compose.yml文件来指定jar文件的位置,以及properties文件的位置。例如:

services: my-service: image: my-image command: java -jar my-jar.jar --spring.config.location=/path/to/my-properties.properties

应该是文件路径的问题。虽然有这个文件,但是linux下的文件路径格式不一样导致的。看你的日志中打印的路径有file:这样的路径,这个路径表示的目录是相对目录,所以你可以尝试在jar包的所在目录执行启动命令。如果不能解决,那你启动时,直接指定配置文件的路径试试看:
--spring.config.location=/usr/apps/application.properties(这个是配置文件的路径)

你可以为所有组件分别在docker-compose.yml中定义jar文件和properties,然后使用docker-compose up -d来启动它们。

services:
  myservice:
    image: your_docker_image
    command: java -jar -Dspring.config.location=/usr/src/app/config/application.properties "/usr/src/app/MyApp.jar"
    volumes:
      - .config:/usr/src/app/config:ro
```yaml


```

根据您提供的信息,您正在使用 Docker Compose 启动一个 Java 应用程序的 JAR 文件。您的 Windows 主机可以正常工作,但是 Linux 主机无法找到配置文件。这可能是因为在 Linux 主机上文件路径不正确导致的。

在 Docker 中,您可以将本地文件挂载到 Docker 容器中。这样,容器可以访问您主机上的文件系统,从而可以读取和写入文件。您可以使用 Docker Compose 中的 volumes 选项来将主机上的文件挂载到容器中。例如:

version: '3'
services:
  my-app:
    image: my-image
    ports:
      - "8080:8080"
    volumes:
      - /path/on/host/my-config.properties:/path/in/container/my-config.properties

在上面的示例中,my-app 服务的容器将会把主机上的 /path/on/host/my-config.properties 文件挂载到容器内的 /path/in/container/my-config.properties 路径下。

如果您使用了类似上面的 volumes 配置,您需要将 my-app 服务的容器中的配置文件路径更新为 /path/in/container/my-config.properties。

如果您的配置文件在您的 JAR 文件中,那么您需要将配置文件从 JAR 文件中解压缩出来,并将其挂载到容器中。

另外,您还可以在 Docker Compose 中设置 working_dir 选项,以指定容器的工作目录。例如:

version: '3'
services:
  my-app:
    image: my-image
    ports:
      - "8080:8080"
    volumes:
      - /path/on/host/my-config.properties:/app/my-config.properties
    working_dir: /app
    command: java -jar my-app.jar

在上面的示例中,my-app 服务的容器的工作目录被设置为 /app。这意味着容器中的 Java 进程将会在 /app 目录下寻找 JAR 文件和配置文件。

如果使用 Docker Compose 启动的 Spring Boot 应用程序在容器中找不到配置文件,通常是因为容器中的文件路径与本地文件路径不同。

可以使用以下步骤解决这个问题:

1、在 Dockerfile 中,将应用程序的配置文件打包到 jar 包中。例如,假设应用程序的配置文件为 application.properties,可以在 Dockerfile 中添加以下命令:

COPY application.properties /app/


2、在 docker-compose.yml 文件中,将本地目录与容器目录进行映射。例如,可以将应用程序的配置文件目录 /path/to/local/config 映射到容器中的 /app 目录。在 docker-compose.yml 文件中,可以添加以下命令:

version: '3'
services:
  app:
    build: .
    volumes:
      - /path/to/local/config:/app
    ports:
      - "8080:8080"


3、在 Spring Boot 应用程序中,可以使用以下命令来指定配置文件的路径:

java -jar /app/myapp.jar --spring.config.name=application


--spring.config.name=application 指定配置文件的名称为 application,如果使用其他名称,请相应更改。

这样,应用程序在容器中启动时,应该能够找到应用程序的配置文件了。

如果你使用的是 Docker Compose 来启动容器,并且在容器中运行了一个 Java JAR 应用,那么需要确保配置文件能够正确的被 JAR 应用读取到。在 Linux 系统中,可以通过将配置文件挂载到容器中来实现这一点。

假设你的配置文件是 application.properties,你可以将它挂载到容器中的 /app/config/ 目录中,然后在运行 JAR 应用时通过指定配置文件路径的方式来让应用读取到这个文件。具体步骤如下:

  1. docker-compose.yml 文件中,添加配置文件挂载的定义: yaml
    version: '3'
    services:
      app:
        image: your-app-image
        volumes:
          - ./config:/app/config
        command: java -jar app.jar --spring.config.location=/app/config/application.properties
    
    这里假设应用的启动命令是 java -jar app.jar,配置文件是 application.properties,且配置文件位于 /app/config 目录中。./config 是你本地存放配置文件的路径。
  2. 在 JAR 应用的启动命令中,通过 --spring.config.location 参数指定配置文件路径。这里的路径应该是容器中的路径,因此需要与上一步中的挂载路径一致。 shell
    java -jar app.jar --spring.config.location=/app/config/application.properties
    
    这样在容器启动后,JAR 应用就会从 /app/config/application.properties 中读取配置文件了。

可参考思路:
1、直接指定配置文件的路径
2、启动docker ,需要挂载到本地

思路:首先判断下String newpath = Commonutil. getProjectRootPath() + path代码行,查看Commonutil工具类中获取项目根路径方法有没有区分系统问题;其次,可能是系统下路径错误,找不到对应文件,使用volumes进行正确的路径挂载

使用绝对路径指定配置文件的位置

确保你的java项目正确指向了你的配置文件,linux和windwos目录不是完全一样的

在Docker Compose中启动Jar文件时,如果发现无法找到properties文件,可能是因为在容器内部的工作目录不是代码包所在的目录,或者是Docker Compose没有正确地挂载配置文件。

有以下几个建议:

确保Dockerfile中定义的容器工作目录与代码包中的工作目录相同。可以通过在Dockerfile中使用WORKDIR命令来设置容器的工作目录。

确认Docker Compose中是否正确地挂载了配置文件目录,可以在docker-compose.yml文件中添加volumes字段来挂载本地配置文件目录,例如:


version: '3'
services:
  myapp:
    image: myapp:latest
    volumes:
      - ./config:/app/config

上面的配置表示将本地的./config目录挂载到容器内的/app/config目录中。

确认代码包中的properties文件路径是否正确,可以在Dockerfile中使用COPY或ADD命令将配置文件复制到容器中,或者在Docker Compose中挂载本地配置文件目录,然后在应用程序中使用相对路径或绝对路径来读取配置文件

可以使用 Spring 提供的 PropertiesLoaderUtils
允许直接通过基于类路径的文件地址加载属性资源

PropertiesLoaderUtils.loadAllProperties("loadFFmpeg.properties");

题主,这个问题我来替你解决,若有帮助,还望采纳,点击回答右侧采纳即可。

仔细看了你的问题描述,你 在Linux 主机无法找到配置文件,其实问题就是因为在 Linux 主机上文件路径不正确导致的而报错,我提供两种思路,
1、在 Docker 中,您可以将本地文件挂载到 Docker 容器中。
2、访问properties使用绝对路径。