docker上的Spring启动无法从资源中读取属性文件,但可以在没有Docker的情况下使用java -jar

Posted

技术标签:

【中文标题】docker上的Spring启动无法从资源中读取属性文件,但可以在没有Docker的情况下使用java -jar【英文标题】:Spring boot on docker not able to read a property file from resources, but the can without Docker with java -jar 【发布时间】:2021-06-20 13:34:24 【问题描述】:

我的 Spring Boot 应用程序有一个带有 AWS 凭证的属性文件,当我运行 gradle bootJar 时,会构建包含所有依赖项的胖 jar,我可以使用 java -jar 运行它

但是当我捆绑我构建一个 Docker 映像时,我得到的是以下错误,基本上是抱怨它在资源下的属性文件中找不到 AWS 凭证

2021-03-23 17:51:01.542 ERROR 1 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.amazonaws.SdkClientException: Unable to load AWS credentials from any provider in the chain: [EnvironmentVariableCredentialsProvider: Unable to load AWS credentials from environment variables (AWS_ACCESS_KEY_ID (or AWS_ACCESS_KEY) and AWS_SECRET_KEY (or AWS_SECRET_ACCESS_KEY)), SystemPropertiesCredentialsProvider: Unable to load AWS credentials from Java system properties (aws.accessKeyId and aws.secretKey), WebIdentityTokenCredentialsProvider: To use assume role profiles the aws-java-sdk-sts module must be on the class path., com.amazonaws.auth.profile.ProfileCredentialsProvider@61a02480: profile file cannot be null, com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper@23b9c9f8: Failed to connect to service endpoint: ]] with root cause

再次注意,我可以使用具有相同凭据属性文件的 java -jar 运行组装后的 fat jar,没有任何问题。

这是我的 Dockerfile

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG DEPENDENCY=target/dependency
COPY $DEPENDENCY/BOOT-INF/lib /app/lib
COPY $DEPENDENCY/META-INF /app/META-INF
COPY $DEPENDENCY/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","com.myapp.myapp"]

这些是 build.gradle 中的 docker 任务(当然是在导入 palantir 之后)来构建图像

apply plugin: 'com.palantir.docker'

group = 'com.myapp'

bootJar 
    baseName = 'mayapp'
    version =  '0.1.0'


task unpack(type: Copy) 
    dependsOn bootJar
    from(zipTree(tasks.bootJar.outputs.files.singleFile))
    into("build/dependency")

docker 
    name "$project.group/$bootJar.baseName"
    copySpec.from(tasks.unpack.outputs).into("dependency")
    buildArgs(['DEPENDENCY': "dependency"])

这就是我运行容器的方式

docker run -p 8080:8080 com.myapp/myapp

【问题讨论】:

【参考方案1】:

应该是ENTRYPOINT ["java","-cp","/app:/app/lib/*","com.myapp.myapp"] 不确定如何使用 app:app/lib/* 找到您的类路径

【讨论】:

感谢您的回答,我继续进行更改并重建了 docker 映像,但仍然出现相同的错误。您在上面的配置中是否看到任何其他问题。 你能跑docker exec xxx ls /app AwsCredentials.properties META-INF application.properties com lib 静态模板 然后我运行了cat AwsCredentials.properties,它具有正确的凭据 如何加载属性文件?

以上是关于docker上的Spring启动无法从资源中读取属性文件,但可以在没有Docker的情况下使用java -jar的主要内容,如果未能解决你的问题,请参考以下文章

尝试启动docker时不断收到无法读取CA证书

如何将现有docker容器上的Spring启动应用程序链接到数据库?

无法在 docker 容器内以非阻塞方式读取类路径资源文件

Spring Boot Jar 包启动时如何加载外部资源

Spring Boot Jar 包启动时如何加载外部资源

spring-boot 无法在 docker 中启动