簡體   English   中英

在Docker容器中運行時無法從Spring Cloud Config Server獲取配置

[英]Unable to get Configuration from Spring Cloud Config Server while its running within a Docker Container

我一直在努力解決這一問題,有一天沒有運氣,我真的很困惑這個錯誤是什么。 我使用Spring Boot版本1.5.9.RELEASE和Spring Cloud Edgware.RELEASE創建了一個簡單的Spring Cloud Config Server。 我的配置倉庫是一個位桶存儲庫。 對於Docker,我正在使用fabric8 maven docker插件來構建docker鏡像,並將其部署在Mac的Docker上。 我也使用Java9。我能夠構建docker映像,並在端口8888上運行它,但是當我調用運行狀況端點時,它是“ Down”。 當我嘗試運行以下Get Request( http:// localhost:8888 / sample-api / dev )時,出現以下錯誤:

{
    "timestamp": 1515552923667,
    "status": 404,
    "error": "Not Found",
    "exception": "org.springframework.cloud.config.server.environment.NoSuchRepositoryException",
    "message": "Cannot clone or checkout repository: https://bitbucket.org/<project>/<repo>.git",
    "path": "/sample-api/dev"
}

以下是我的Dockerfile,所有敏感數據均已刪除

FROM openjdk:9
ENV PROFILE dev
VOLUME /config
ADD /maven/*.jar app.jar
EXPOSE 8888
RUN bash -c 'touch /app.jar'
WORKDIR /
ENTRYPOINT exec java -Dspring.profiles.active=$PROFILE -Djava.security.egd=file:/dev/./urandom -jar /app.jar

以下是我的應用程序yaml文件:

server:
  port: 8888
spring:
  application:
    name: sample-config-server
  cloud:
    config:
      server:
        encrypt:
          enabled: false
        git:
          uri: https://bitbucket.org/<project>/<repo>.git
          username: ${GIT_USER_NAME}
          password: ${GIT_PASSWORD}

username: ${CLOUD_CONFIG_NAME}
password: ${CLOUD_CONFIG_PASSWORD}

以下是我用於在docker上運行的命令:

mvn clean package docker:build
docker run -p 8888:8888 -d sample/<sample-config-server:latest

當我使用mvn -Dspring.profiles.active = dev spring-boot:run在本地運行時,一切正常。 僅當我收到404錯誤時,才在Mac的Docker中運行。 我嘗試將其切入容器並手動克隆git repo,我能夠做到這一點沒有問題。 我不知道問題出在我的Spring Cloud配置甚至是Spring Cloud Config Project本身。

有人遇到過這個問題嗎? 誰能復制這個問題?

更新:

我在minikube中運行了相同的容器,但仍然遇到相同的問題...我全天候工作以嘗試解決此問題,但尚未成功。 我會及時通知你的。

我終於能夠解決問題。 這與Spring Cloud Config或我的Spring Cloud Config配置無關。 在仔細分析日志后,我發現來自JGit的以下錯誤:

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

似乎openJDK 9 docker映像缺少其cacerts文件中的內容,從而阻止JGit與位桶建立成功的https連接,從而導致NoSuchRepositoryException。 我搜索了此問題,並在該主題上找到了此鏈接:

https://github.com/docker-library/openjdk/issues/145

根據我在鏈接中看到的內容,建議使用9-jdk-slim而不是9-jdk,因為9-jdk-slim沒有空的cacerts文件。

在我的Dockerfile中,我將FROM語句更改為使用9-jdk-slim而不是9-jdk。 我使用Maven Fabric 8插件重建了圖像,然后將圖像作為容器運行。 我能夠通過Spring Cloud Config服務器成功從Bitbucket獲取配置。 這適用於Mac的Docker和Minikube。 我的經驗教訓是完全啟用Spring Boot中的日志記錄,並仔細分析日志以解決此類問題。 希望這對其他有類似問題的開發人員有所幫助。

1)您對主機和容器中端口的引用指的是8888,但您包含的鏈接表示http://localhost:8080/sample-api/dev 是錯字,還是您在端口8080上監聽了另一個應用程序。

可以使用以下格式查詢配置服務器:

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

在您的Bitbucket存儲庫中如何命名屬性文件?

順便說一句,我已經在博客上寫了這個確切的主題,提供了源代碼和docker鏡像,它可能會幫助您入門:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM