【问题标题】:Dockerized Spring Boot application not reading VCAP_SERVICES environment variable JSONDockerized Spring Boot 应用程序未读取 VCAP_SERVICES 环境变量 JSON
【发布时间】:2019-12-12 13:07:33
【问题描述】:

我正在尝试将 VCAP_SERVICES(所有大写字母都带有下划线)传递给其中包含 Spring Boot 应用程序的 docker 容器。应用程序出现并简单地忽略变量中的任何值。我正在使用配置服务器,日志的第一行通常记录该配置服务器所在的位置。它总是尝试访问 localhost:8888,这是默认设置。

Docker 镜像基于 openjdk:8 基础镜像,扩展的 jar 文件被简单地复制到其中。

我尝试了许多不同的方式来传递 json:

1- 作为一个名为 VCAP_SERVICESENV 并且值只是 JSON 对象 2- 作为一个名为 SPRING_APPLICATION_JSON 的 ENV,带有一个带有名为 VCAP_SERVICES 的属性的 JSON 对象 3- 试图从我的 google-fu 传递不同的 ENV 变量”

ENV SPRING_CLOUD_DEPLOYER_CLOUDFOUNDRY_STREAM_USE_SPRING_APPLICATION_JSON=false 
ENV SPRING_CLOUD_DEPLOYER_CLOUDFOUNDRY_TASK_USE_SPRING_APPLICATION_JSON=false
ENV JBP_CONFIG_SPRING_AUTO_RECONFIGURATION="{enabled: false}"
FROM openjdk:8
EXPOSE 80
EXPOSE 443
WORKDIR / app

ENV SPRING_APPLICATION_NAME="application name"  
ENV VCAP_SERVICES="{  \"p-config-server \": [ { \"credentials \": {  \"access_token_uri \":  \"https://configserverURL/oauth/token \",  \"client_id \":  \"AUNIQUECLIENTID \",  \"client_secret \":  \"ASECRET\",  \"uri \":  \"https://CONFIGSERVERURL \" },  \"gateway_name \":  \" \",  \"label \":  \"p-config-server \",  \"name \":  \"config-server \",  \"instance_name \":  \"config-server \", \"tags \": [  \"configuration \",  \"spring-cloud \" ],  \"volume_mounts \": [] }  }"

COPY / .
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-cp",".","org.springframework.boot.loader.JarLauncher"]

我希望日志记录表明正确的配置服务器:

main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : https://CONFIGSERVERURL

但是我得到了

main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:8888

启动命令在 PCF 中如下所示:

 JAVA_OPTS="-agentpath:$PWD/.java-buildpack/open_jdk_jre/bin/jvmkill-1.16.0_RELEASE=printHeapHistogram=1 -Djava.io.tmpdir=$TMPDIR -Djava.ext.dirs=$PWD/.java-buildpack/container_security_provider:$PWD/.java-buildpack/open_jdk_jre/lib/ext -Djava.security.properties=$PWD/.java-buildpack/java_security/java.security $JAVA_OPTS" && CALCULATED_MEMORY=$($PWD/.java-buildpack/open_jdk_jre/bin/java-buildpack-memory-calculator-3.13.0_RELEASE -totMemory=$MEMORY_LIMIT -loadedClasses=32446 -poolType=metaspace -stackThreads=250 -vmOptions="$JAVA_OPTS") && echo JVM Memory Configuration: $CALCULATED_MEMORY && JAVA_OPTS="$JAVA_OPTS $CALCULATED_MEMORY" && MALLOC_ARENA_MAX=2 SERVER_PORT=$PORT eval exec $PWD/.java-buildpack/open_jdk_jre/bin/java $JAVA_OPTS -cp $PWD/. org.springframework.boot.loader.JarLauncher

【问题讨论】:

  • 请提供代码示例,说明您如何尝试从代码中读取环境变量。 VCAP_SERVICES 是唯一没有被读取的唯一环境变量吗?这里有一些对话stackoverflow.com/questions/35531661/…
  • 我在 Ops 部门并将现有(正常运行的)应用程序从 PCF 转换为 Docker 容器。我假设他们正在使用 Spring 执行器阅读它
  • 您不需要JBP_CONFIG_SPRING_AUTO_RECONFIGURATION,因为那是用于 Java buildpack 的,不会在您的容器中运行。几个建议。 1.) 当它在 Cloud Foundry 上运行时,从应用程序复制启动命令。 2.) 在容器中运行 env 并确认您的 VCAP_SERVICES 可见且正确填充。如果可以,请将其与 Cloud Foundry 上您的应用程序的 VCAP_SERVICES 值进行比较。希望有帮助!
  • @DanielMikusa,感谢您的提示。我确实验证了 env 变量已正确填充并且 JSON 有效。 PCF 的启动命令如下所示:(见上面的编辑)

标签: spring-boot docker environment-variables cloud-foundry


【解决方案1】:

原来你还需要一个环境变量裸 VCAP_APPLICATION 来触发另一个变量的读取。它甚至可以是空的

【讨论】:

    猜你喜欢
    • 2021-07-16
    • 2021-03-12
    • 2019-12-04
    • 1970-01-01
    • 2020-01-18
    • 2017-12-01
    • 2020-05-05
    • 1970-01-01
    • 2020-11-26
    相关资源
    最近更新 更多