微服务 java 属性 未在 application.properties 中设置
Microservice java property not set in application.properties
我在 micros1-mvc 微服务 application.properties 中有以下行:eureka.client.serviceUrl.defaultZone=${EUREKA_SERVER}
我在容器内执行微服务:
sudo docker run -p 8081:8081 --network mynetw --env JAVA_OPTS="-DEUREKA_SERVER=http://eurekaserver:8761/eureka" micros1-mvc
当微服务尝试与 Eureka 连接时,它说:
overyClient :
DiscoveryClient_SERVICEASERVICE/1754e70517a8:serviceaservice:8081 -
was unable to refresh its cache! This periodic background refresh will
be retried in 30 seconds. status = There is no known eureka server;
cluster server list is empty stacktrace =
com.netflix.discovery.shared.transport.TransportException: There is no
known eureka server; cluster server list is empty at
com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:108)
at
com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134)
at
com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.execute(EurekaHttpClientDecorator.java:137)
at
com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)
at
com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134)
at
com.netflix.discovery.DiscoveryClient.getAndStoreFullRegistry(DiscoveryClient.java:1101)
at
com.netflix.discovery.DiscoveryClient.fetchRegistry(DiscoveryClient.java:1014)
at
com.netflix.discovery.DiscoveryClient.refreshRegistry(DiscoveryClient.java:1531)
看起来微服务属性文件在 docker 执行中没有收到指定的值
经过一番搜索后,我发现 JAVA_OPTS 是 Catalina (Tomcat) 特有的。查看 tomcat 安装的 bin 文件夹,您会发现一个 shell 脚本,它处理将 JAVA_OPTS 传递到 exec 行。
像这样的 Dockerfile:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","${JAVA_OPTS}","-jar","/app.jar"]
有:
docker run -p 9000:9000 -e JAVA_OPTS=-Dserver.port=9000 myorg/myapp
失败。这会失败,因为 ${} 替换需要 shell。 exec 表单不使用 shell 来启动进程,因此不应用选项。您可以通过将入口点移动到脚本或在入口点中显式创建 shell 来解决这个问题。以下示例显示如何在入口点创建 shell:
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app.jar"]
然后您可以通过 运行 以下命令启动此应用程序:
docker run -p 8080:8080 -e "JAVA_OPTS=-Ddebug -Xmx128m" myorg/myapp
我在 micros1-mvc 微服务 application.properties 中有以下行:eureka.client.serviceUrl.defaultZone=${EUREKA_SERVER}
我在容器内执行微服务:
sudo docker run -p 8081:8081 --network mynetw --env JAVA_OPTS="-DEUREKA_SERVER=http://eurekaserver:8761/eureka" micros1-mvc
当微服务尝试与 Eureka 连接时,它说:
overyClient : DiscoveryClient_SERVICEASERVICE/1754e70517a8:serviceaservice:8081 - was unable to refresh its cache! This periodic background refresh will be retried in 30 seconds. status = There is no known eureka server; cluster server list is empty stacktrace = com.netflix.discovery.shared.transport.TransportException: There is no known eureka server; cluster server list is empty at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:108) at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.execute(EurekaHttpClientDecorator.java:137) at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) at com.netflix.discovery.DiscoveryClient.getAndStoreFullRegistry(DiscoveryClient.java:1101) at com.netflix.discovery.DiscoveryClient.fetchRegistry(DiscoveryClient.java:1014) at com.netflix.discovery.DiscoveryClient.refreshRegistry(DiscoveryClient.java:1531)
看起来微服务属性文件在 docker 执行中没有收到指定的值
经过一番搜索后,我发现 JAVA_OPTS 是 Catalina (Tomcat) 特有的。查看 tomcat 安装的 bin 文件夹,您会发现一个 shell 脚本,它处理将 JAVA_OPTS 传递到 exec 行。
像这样的 Dockerfile:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","${JAVA_OPTS}","-jar","/app.jar"]
有:
docker run -p 9000:9000 -e JAVA_OPTS=-Dserver.port=9000 myorg/myapp
失败。这会失败,因为 ${} 替换需要 shell。 exec 表单不使用 shell 来启动进程,因此不应用选项。您可以通过将入口点移动到脚本或在入口点中显式创建 shell 来解决这个问题。以下示例显示如何在入口点创建 shell:
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app.jar"]
然后您可以通过 运行 以下命令启动此应用程序:
docker run -p 8080:8080 -e "JAVA_OPTS=-Ddebug -Xmx128m" myorg/myapp