java - docker-compose java 无法访问 jarfile
问题描述
我正在尝试将 Spring Boot 应用程序作为 Docker Compose 设置中的一项服务运行,但是每当我运行docker-compose up -d
运行 Spring Boot 应用程序的容器时,它就会失败并立即退出。出于本文的目的,我使用了诸如“mycontainer”和“myfile”之类的通用名称。
运行docker-compose logs core
显示报错信息为:
mycontainer | Error: unable to access jarfile myjar.jar
我的 docker-compose 文件是:
version: '3.3'
services:
webapp:
image: webapp_image
container_name: webapp-container
build:
context: ./webapp
dockerfile: Dockerfile
volumes:
- './webapp:/usr/src/app'
ports:
- 3000:3000
- 35729:35729
environment:
- NODE_ENV=development
- env_file=./webapp/.env
core:
image: core_image
container_name: core-container
build:
context: ./core
dockerfile: Dockerfile
volumes:
- './core:/usr/src/core'
- './algorithms:/usr/src/algorithms'
ports:
- 8080:8080
environment:
- JARFILE=myjar.jar
- JAVA_OPTIONS=-Djava.security.egd=file:/dev/./urandom
运行 Spring Boot 应用程序的服务的 Dockerfilecore
是这样的:
FROM openjdk:8-jdk-alpine
RUN mkdir -p /usr/src/core
RUN mkdir -p /usr/src/algorithms
ADD ./myproject/target/myjar.jar /usr/src/core
ADD ./algorithms /usr/src/algorithms
WORKDIR /usr/src/core
CMD java $JAVA_OPTIONS -jar $JARFILE
如果我从映像运行单个容器core_image
,并设置我在 docker-compose 文件中定义的相同环境变量,我可以成功启动 Spring Boot 应用程序,如下所示:
$ docker run -it -p 8080:8080 --name mycontainer core_image sh
$ /usr/src/core # ls -l
total 15852
-rwxr-xr-x 1 root root 16228579 Apr 21 22:44 myjar.jar
$ /usr/src/core # java $JAVA_OPTIONS -jar $JARFILE
但是,如果我从与容器的一部分相同的图像运行docker-compose up -d
容器失败,并出现 Java 无法访问 jarfile 的错误。我尝试在CMD
Dockerfile 中指定 jarfile 的绝对路径,但这在从 Docker Compose 运行时无济于事。
有谁知道这可能是什么原因造成的?我在 Windows 10 主机上。任何帮助是极大的赞赏。
解决方案
您似乎正在通过在 docker-compose 中从 ./core 挂载内容来覆盖 /usr/src/core [将 jar 文件复制到的位置] 的内容。从 services->core->volumes 中删除下面的挂载并试一试。
volumes:
- './core:/usr/src/core'
推荐阅读
- date - 如何使用 Firestore 仅从特定日期获取数据?
- python - 如何通过在python中的json响应中查找来替换字符串中的逗号分隔ID
- python - AttributeError: 'NoneType' 对象在美丽的汤中没有属性 'strip'
- javascript - 如何在鼠标离开时关闭 ant-design-vue 选择选项?
- jquery - 条件在 jquery required 验证器中不起作用
- python - 如何干燥一个接受多个输入的代码,为每个输入执行相同的功能,并一次为输出提供所有内容?
- ios - 在 podspec 中 OTHER_LDFLAGS 有什么用?
- c# - ProtoBuf 网络字典重复键处理(映射)
- node.js - 如何在猫鼬的路线中调用路线?
- mysql - 在更大的数据表上为每个用户选择第一行/最后一行的 SQL 性能