Docker无法访问jar文件

Posted

技术标签:

【中文标题】Docker无法访问jar文件【英文标题】:Docker unable to access jar file 【发布时间】:2018-10-17 09:10:36 【问题描述】:

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

【问题讨论】:

这很难在没有看到任何错误消息的情况下回答。你能运行docker-compose logs spring 并发布输出吗? 你确定你在卷/my/project/dir中有build/libs/spring-project-0.1.0.jar吗? @mbuechmann 我添加了日志 @BukharovSergey 我很确定它存在。当我在本地机器上运行java -jar /my/project/dir/build/libs/spring-project-0.1.0.jar 时,应用程序就会启动。 【参考方案1】:

我没有看到您将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" ]

撰写文件:

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 build 要求其构建上下文位于当前目录中):

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" ]

撰写文件:

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

【讨论】:

这成功了!我也试图复制它,但没有成功。我跟着这个教程spring.io/guides/gs/spring-boot-docker 我现在正在编写一个编辑,使 COPY 方法更有用,因为我使用了一个小快捷方式来说明它。

以上是关于Docker无法访问jar文件的主要内容,如果未能解决你的问题,请参考以下文章

由于出现此错误,无法运行 docker 容器:无法访问 jarfile app.jar

运行 Docker 映像时无法访问 jarfile

docker运行错误:无法访问jarfile

无法访问 docker 容器中的 REST 端点

无法访问docker镜像服务器?

Eclipse - JAR 创建失败“找不到类路径上的类文件或无法访问...”