Docker无法访问jar文件。

7
Docker容器无法访问通过挂载点/my/project/dir访问的jar文件。 我确定这不是权限问题,因为我在本地更改了访问权限,所以应该能够读/写/执行它。
这是Dockerfile:
FROM tomcat:9-jre8
RUN apt-get update && apt-get install librrds-perl rrdtool -y
VOLUME ["/data/rrdtool", "/my/project/dir"]
ENTRYPOINT [ "java","-jar","/my/project/dir/build/libs/spring-project-0.1.0.jar" ]

以下是docker-compose.yml文件:

version: '2'
services:
 db:
   container_name: db1
   image: mysql:8
   restart: always
   environment:
     MYSQL_ROOT_PASSWORD: password123
     MYSQL_USER: user123
     MYSQL_PASSWORD: pasw
     MYSQL_DATABASE: mydb
   expose:
     - "3307"
 db2:
   container_name: db2
   image: mysql:8
   restart: always
   environment:
     MYSQL_ROOT_PASSWORD: password123
     MYSQL_USER: user123
     MYSQL_PASSWORD: pasw
     MYSQL_DATABASE: mydb2
   expose:
     - "3308"
 spring:
   container_name: spring-boot-project
   build: 
     context: ./
     dockerfile: Dockerfile
   links:
     - db:db1
     - db2:db2
   depends_on:
     - db
     - db2
   expose:
     - "8081"
   ports:
     - "8081:8081"
   restart: always

这是docker-compose logs spring的输出结果:
Error: Unable to access jarfile /my/project/dir/build/libs/spring-project-0.1.0.jar

1
没有看到任何错误信息,这个问题很难回答。你能否运行 docker-compose logs spring 并发布输出? - mbuechmann
你确定在卷/my/project/dir中有build/libs/spring-project-0.1.0.jar文件吗? - Bukharov Sergey
@mbuechmann,我添加了日志。 - Merve Sahin
@BukharovSergey 我非常确定它存在。当我在本地机器上运行 java -jar /my/project/dir/build/libs/spring-project-0.1.0.jar 时,应用程序会启动。 - Merve Sahin
2个回答

9

我没有看到你将jar复制到任何容器中。你应该尝试将一个VOLUME声明从Dockerfile移动到compose文件中的spring服务,就像这样:

  volumes:
    - /my/project/dir:/app

然后在 Dockerfile 中,您应该指向该目录:

ENTRYPOINT [ "java","-jar","/app/build/libs/spring-project-0.1.0.jar" ]

如果您希望部署它(例如),则应将项目文件直接复制到映像中,而不是使用volumes方法。因此,在 Dockerfile 中,您需要执行以下操作:

COPY . /app

替换VOLUME [..]

将所有内容整合在一起:

开发:

Dockerfile:

FROM tomcat:9-jre8
RUN apt-get update && apt-get install librrds-perl rrdtool -y
ENTRYPOINT [ "java","-jar","/app/build/libs/spring-project-0.1.0.jar" ]

Compose文件:

version: '2'
services:
    [..]
    spring:
       container_name: spring-boot-project
       build: .
       links:
         - db:db1
         - db2:db2
       depends_on:
         - db
         - db2
       ports:
         - "8081:8081"
       restart: always
       volumes:
         - /my/project/dir:/app

部署:

Dockerfile(放置在项目文件夹内,docker构建要求其构建上下文在当前目录中):

FROM tomcat:9-jre8
RUN apt-get update && apt-get install librrds-perl rrdtool -y
COPY . /app
ENTRYPOINT [ "java","-jar","/app/build/libs/spring-project-0.1.0.jar" ]

compose文件:

version: '2'
services:
    [..]
    spring:
       container_name: spring-boot-project
       build: .
       links:
         - db:db1
         - db2:db2
       depends_on:
         - db
         - db2
       expose:
         - "8081"

这个方法可行!我也试图复制它,但没有成功。我按照这个教程 https://spring.io/guides/gs/spring-boot-docker/ 进行操作。 - Merve Sahin
我正在撰写一篇编辑,使“COPY”方法更易用,因为我使用了一个小技巧来说明它。 - trust512

2
如果您正在使用使用Maven构建的Spring-Boot项目,请尝试以下内容:

Dockerfile文件。

FROM maven:3.8.4-openjdk-17 as maven-builder
COPY src /app/src
COPY pom.xml /app

RUN mvn -f /app/pom.xml clean package -DskipTests
FROM openjdk:17-alpine

COPY --from=maven-builder app/target/dockube-spring-boot.jar /app-service/dockube-spring-boot.jar
WORKDIR /app-service

EXPOSE 8080
ENTRYPOINT ["java","-jar","dockube-spring-boot.jar"]

dockube-spring-boot.jar // 用你生成的jar名称替换此处

这里有示例代码可供参考


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接