【问题标题】:Spring Boot fails to start up in Docker containerSpring Boot 在 Docker 容器中启动失败
【发布时间】:2022-01-19 23:08:32
【问题描述】:

我有一个 Spring Boot 应用程序,可以在本地运行而不会出错。我正在尝试在 Docker 容器中运行它,但出现了我不理解的新错误。

Dockerfile:

FROM maven:3.8-jdk-8 AS build
COPY . /usr/app
WORKDIR /usr/app
RUN mvn clean package

FROM openjdk:8-alpine
COPY --from=build /usr/app/target/myapp-*.jar /usr/app/myapp.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/app/myapp.jar"]

错误堆栈顶部:

WARN 8 --- [           main] com.amazonaws.util.EC2MetadataUtils      : Unable to retrieve the requested metadata (/latest/dynamic/instance-identity/document). Failed to connect to service endpoint:

com.amazonaws.SdkClientException: Failed to connect to service endpoint:
    at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:100) ~[aws-java-sdk-core-1.11.792.jar!/:na]
    at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:70) ~[aws-java-sdk-core-1.11.792.jar!/:na]
    at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.readResource(InstanceMetadataServiceResourceFetcher.java:75) ~[aws-java-sdk-core-1.11.792.jar!/:na]
    at com.amazonaws.internal.EC2ResourceFetcher.readResource(EC2ResourceFetcher.java:66) ~[aws-java-sdk-core-1.11.792.jar!/:na]
    at com.amazonaws.util.EC2MetadataUtils.getItems(EC2MetadataUtils.java:402) [aws-java-sdk-core-1.11.792.jar!/:na]
    at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:371) [aws-java-sdk-core-1.11.792.jar!/:na]
    at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:367) [aws-java-sdk-core-1.11.792.jar!/:na]
    at com.amazonaws.util.EC2MetadataUtils.getEC2InstanceRegion(EC2MetadataUtils.java:282) [aws-java-sdk-core-1.11.792.jar!/:na]
    at com.amazonaws.regions.InstanceMetadataRegionProvider.tryDetectRegion(InstanceMetadataRegionProvider.java:59) [aws-java-sdk-core-1.11.792.jar!/:na]
    at com.amazonaws.regions.InstanceMetadataRegionProvider.getRegion(InstanceMetadataRegionProvider.java:50) [aws-java-sdk-core-1.11.792.jar!/:na]
    at com.amazonaws.regions.AwsRegionProviderChain.getRegion(AwsRegionProviderChain.java:46) [aws-java-sdk-core-1.11.792.jar!/:na]
    at com.amazonaws.client.builder.AwsClientBuilder.determineRegionFromRegionProvider(AwsClientBuilder.java:475) [aws-java-sdk-core-1.11.792.jar!/:na]
    at com.amazonaws.client.builder.AwsClientBuilder.setRegion(AwsClientBuilder.java:458) [aws-java-sdk-core-1.11.792.jar!/:na]
    at com.amazonaws.client.builder.AwsClientBuilder.configureMutableProperties(AwsClientBuilder.java:424) [aws-java-sdk-core-1.11.792.jar!/:na]
    at com.amazonaws.client.builder.AwsSyncClientBuilder.build(AwsSyncClientBuilder.java:46) [aws-java-sdk-core-1.11.792.jar!/:na]
    at org.springframework.cloud.aws.autoconfigure.secretsmanager.AwsSecretsManagerBootstrapConfiguration.smClient(AwsSecretsManagerBootstrapConfiguration.java:63) [spring-cloud-starter-aws-secrets-manager-config-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]

我不确定这个错误是否重要,因为我在本地看到了类似的东西(尽管现在已经解决了)并且应用程序仍然启动。

创建 bean 时出错(我认为这是导致崩溃的原因):

ERROR 23 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration': Unsatisfied dependency expressed through field 'propertySourceLocators'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'awsSecretsManagerPropertySourceLocator' defined in class path resource [org/springframework/cloud/aws/autoconfigure/secretsmanager/AwsSecretsManagerBootstrapConfiguration.class]: Unsatisfied dependency expressed through method 'awsSecretsManagerPropertySourceLocator' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'smClient' defined in class path resource [org/springframework/cloud/aws/autoconfigure/secretsmanager/AwsSecretsManagerBootstrapConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.amazonaws.services.secretsmanager.AWSSecretsManager]: Factory method 'smClient' threw exception; nested exception is com.amazonaws.SdkClientException: Unable to find a region via the region provider chain. Must provide an explicit region in the builder or setup environment to supply a region.

我将本地 maven 版本与第一张图片中的版本进行了比较,它们是相同的。我的本地 java 版本是 1.8.0_275,而我尝试使用版本为 1.8.0_212 和 1.8.0_312 的图像(我还没有找到具有完全相同版本的图像)。我什至尝试将工作 jar 复制到映像中,而不是将其构建为 Docker 构建的一部分,但我得到了完全相同的错误。

编辑:这是我的具有 aws 区域的 bootstrap.yml 文件

aws:
  secretsmanager:
    name: myapp-s3-creds

cloud:
  aws:
    region:
      static: eu-west-1

【问题讨论】:

  • 这可能会有所帮助 - stackoverflow.com/questions/59517989/…
  • “无法通过区域提供者链找到区域。必须在构建器或设置环境中提供明确的区域才能提供区域。”
  • @SanilKhurana 我用这个问题解决了本地出现的错误。不知道为什么修复在 Docker 容器中不起作用。
  • 问题是 Docker 容器无权访问您的 ~/.aws 文件夹,因此无法访问您的 AWS 凭证和配置。有几种方法可以与容器共享它们,请参阅:question
  • @xerx593 已编辑以添加列出 aws 区域的引导文件

标签: spring amazon-web-services docker


【解决方案1】:

如果你有docker-compose.yml文件,可以在环境标签指定ff环境变量:

environment:
  - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
  - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}

在您的 docker-compose 文件的目录中创建一个 .env 文件,并设置 aws env vars 的值:

AWS_ACCESS_KEY_ID = your_access_key_id
AWS_SECRET_ACCESS_KEY = your_secret_access_key

在 docker-compose build 或 up 上,值将从 .env 文件复制到占位符中。

【讨论】:

    猜你喜欢
    • 2015-03-28
    • 1970-01-01
    • 2016-12-29
    • 2020-02-26
    • 2019-06-23
    • 2018-09-05
    • 2023-04-04
    • 2015-05-09
    • 1970-01-01
    相关资源
    最近更新 更多