首页 > 解决方案 > 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 的错误。我尝试在CMDDockerfile 中指定 jarfile 的绝对路径,但这在从 Docker Compose 运行时无济于事。

有谁知道这可能是什么原因造成的?我在 Windows 10 主机上。任何帮助是极大的赞赏。

标签: javashelldockerspring-bootdocker-compose

解决方案


您似乎正在通过在 docker-compose 中从 ./core 挂载内容来覆盖 /usr/src/core [将 jar 文件复制到的位置] 的内容。从 services->core->volumes 中删除下面的挂载并试一试。 volumes: - './core:/usr/src/core'


推荐阅读