繁体   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