2016-11-18 157 views
2

我想在docker容器上运行jar,它工作正常,但是如果我使用需要从配置文件中读取的jar,它会失败。Docker-compose失败,运行一个从文件中读取配置的jar文件

下一个是我的搬运工,compose.yml:

jar: 
    image: frolvlad/alpine-oraclejdk8:slim 
    ports: 
    - "3000:3000" 
    volumes: 
    - /tmp 
    - "./farr-api-0.1.0.jar:/fagor/app.jar" 
    - "./config/application.yml:/fagor/config/application.yml" 
    command: sh -c 'touch /fagor/app.jar' 
    environment: 
    - JAVA_OPTS="" 
    entrypoint: [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /fagor/app.jar" ] 

例外:

jar_1 | Exception in thread "main" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
jar_1 | at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:62) 
jar_1 | at java.lang.Thread.run(Thread.java:745) 
jar_1 | Caused by: java.lang.reflect.InvocationTargetException 
jar_1 | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
jar_1 | at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
jar_1 | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
jar_1 | at java.lang.reflect.Method.invoke(Method.java:498) 
jar_1 | at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:54) 
jar_1 | ... 1 more 
jar_1 | Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appConfig': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private long es.ikerlan.farr_api.config.AppConfig.id; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'plants[0].plant.id' in string value "${plants[0].plant.id}" 
+0

能当你运行jar您添加的步骤在一个容器中,而不是从泊坞窗,compose.yml? – Tuan

+0

我不尝试使用码头运行,我正在与码头构成直接运行。但我已经执行了另一个jar使用相同的码头组成,但没有que配置文件,它工作正常 –

+0

你的意思是'''farr-api-0.1.0.jar'''不能工作,但其他jar可以吗?日志说'''无法解析占位符'植物[0] .plant.id'的字符串值“$ {plants [0] .plant.id}”''',这是Java错误,而不是Docker错误。 – Tuan

回答

3

下面是一个简单dockerfile那份你的应用程序的图像,安装卷并复制配置到卷。

FROM frolvlad/alpine-oraclejdk8:slim 

MAINTAINER Asier 

VOLUME /config 

COPY your_app.jar app.jar 
COPY your_config.yml config/application.yml 

RUN touch /app.jar 

ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar 

撰写文件可以是简单的像

version: '2' 
    services: 
     farrapi_container: 
     container_name: farrapicontainer 
     build: 
      context: ./ 
      dockerfile: Dockerfile 
     ports: 
     - "3000:3000" 

通过,你应该能够通过主机来更改配置。确保应用程序正确引用配置文件。 反正我仍然会尝试通过环境设置完成配置。使用spring启动时的ENV设置覆盖application.properties中的设置非常简单。

2

这不是一个答案,只是想展示如何使用docker run来测试jar。现在我们:

docker run -it -p 3000:3000 \ 
    -v ./farr-api-0.1.0.jar:/fagor/app.jar \ 
    -v ./config/application.yml:/fagor/config/application.yml \ 
    frolvlad/alpine-oraclejdk8:slim \ 
    /bin/bash 

# Now when you're inside the container 

# Make sure you can run Java 
java -version 
# Make sure you had your files 
ls -la /fagor/app.jar 
ls -ls /fagor/config/application.yml 
# Run it 
export JAVA_OPTS="" 
java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /fagor/app.jar 
+0

真的感谢Tuan,此刻我将使用Dockerfile来创建具有配置的映像,然后我会用docker-compose来运行它。但真的非常感谢您的帮助。我给你我的投票。 –

+0

乐于帮助,@Asier。 – Tuan