![](/img/trans.png)
[英]docker-compose - externalize spring application.properties
[英]spring cloud properties not retrieved when use docker-compose
我面臨一個奇怪的問題,我為我的每個服務(spring-cloud,eureka,my-service)創建一個DockerFile,因此當我啟動docker compose時,spring cloud服務器啟動,eureka啟動,但是我的應用程序未啟動能夠從Spring Cloud檢索配置,但是當我訪問出現在日志中的URL時,它對如何解決此問題一無所知。
關注我的DockerFiles:Spring Cloud Docker文件
FROM openjdk:11.0.2-jre-stretch
RUN ["mkdir", "/root/remote-config-service"]
COPY target/remote-config-service-0.0.1-SNAPSHOT.jar /root/remote-config-service/
ENTRYPOINT java -jar /root/remote-config-service/remote-config-service-0.0.1-SNAPSHOT.jar
EXPOSE 9000 9001
eureka Docker文件:
FROM openjdk:11.0.2-jre-stretch
RUN ["mkdir", "/root/eureka-service-discovery"]
COPY target/eureka-service-discovery-0.0.1-SNAPSHOT.jar /root/eureka-service-discovery/
ENTRYPOINT java -jar /root/eureka-service-discovery/eureka-service-discovery-0.0.1-SNAPSHOT.jar
EXPOSE 8761
我的應用程序Docker文件:
FROM openjdk:11.0.2-jre-stretch
ENV PROFILE="dev"
ADD ["target/product-api-0.0.1-SNAPSHOT.jar", "product-api-0.0.1-SNAPSHOT.jar"]
EXPOSE 18100 8091
RUN sh -c 'touch /product-api-0.0.1-SNAPSHOT.jar'
ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=$PROFILE -jar /product-api-0.0.1-SNAPSHOT.jar" ]
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost:8091/actuator/health || exit 1
Docker撰寫
remote-config-service:
container_name: remote-config-service
build: ./remote-config-service
ports:
- 9000:9000
- 9001:9001
depends_on:
- mysqldb
eureka-service-discovery:
build: ./eureka-service-discovery
container_name: eureka-service-discovery
hostname: localhost
restart: on-failure
ports:
- 8761:8761
product-api:
container_name: product-api
build: ./product-api
ports:
- 18000:18000
- 8091:8091
depends_on:
- eureka-service-discovery
- remote-config-service
- mysqldb
restart: on-failure
當我嘗試啟動我的應用程序(product-api)時,我遇到此錯誤:
c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:9000
c.c.c.ConfigServicePropertySourceLocator : Connect Timeout Exception on Url - http://localhost:9000. Will be trying the next url if available
c.c.c.ConfigServicePropertySourceLocator : Could not locate PropertySource: I/O error on GET request for "http://localhost:9000/product-api/dev": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)
但是當我在瀏覽器中訪問此網址時:
http://localhost:9000/product-api/dev
它工作正常。
有人有什么想法可以幫助我解決這個問題嗎?
Docker容器默認情況下無法通過localhost相互通信,它們在網絡方面彼此隔離。 這就是為什么您可以在瀏覽器中轉到localhost:9000,但容器無法訪問它的原因。 容器中的本地主機僅是該容器的回送地址,而不是主機的回送地址。 有幾種不同的網絡類型(請參閱https://docs.docker.com/network/ ),但默認類型為bridge
。 橋接網絡將您的容器與主機上的其他容器網絡隔離開,然后將主機端口之一上的流量轉發到容器端口(由port: <host>:<container>
定義port: <host>:<container>
條目)。有兩個選項允許容器執行以下操作:互相溝通:
network: host
運行network: host
(不推薦)。 這將直接在主機網絡上運行您的容器,以便它們都可以通過localhost相互通信。 如果使用此port:
,則可以擺脫port:
設置。 容器會將服務使用的任何端口直接綁定到主機(如果要運行使用同一端口的多個容器,這也會導致端口沖突。) 使用用戶定義的網絡https://docs.docker.com/compose/networking/ (推薦)
前docker-compose.yml:
version: '3' services: service1: container_name: service1 build: . networks: - servicenet ports: - 8888:9000 service2: build: . container_name: service2 restart: on-failure networks: - servicenet ports: - 8887:8761 networks: servicenet:
這將允許service1通過http://service1
與service2通信,反之亦然
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.