无法从 Spring 云配置服务器获取配置,而其 运行 在 Docker 容器中

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

我已经努力尝试解决这个问题一天了,但没有成功,我真的很困惑错误是什么。我使用 Spring 引导版本 1.5.9.RELEASE 和 Spring 云 Edgware.RELEASE 创建了一个简单的 Spring 云配置服务器。 My Config Repo 是一个 bitbucket 存储库。对于 Docker,我正在使用 fabric8 maven docker 插件来构建 docker 图像,并将其部署在 Docker 上以用于 Mac。我也在使用 Java 9。我能够构建我的 docker 图像,并且 运行 它在端口 8888 上,但是当我调用健康端点时它是 "Down"。当我尝试 运行 以下 Get 请求 (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"
}

下面是我的Docker文件,所有敏感数据都已删除

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:运行 时,一切都按预期工作。只有当我 运行 within Docker for Mac 时,我才收到 404 错误。我尝试通过 sshing 进入容器并手动克隆我的 git 存储库,我能够毫无问题地做到这一点。问题必须出在我的 Spring 云配置或什至 Spring 云配置项目本身,我不知道。

有没有人遇到过这个问题?任何人都可以复制这个问题吗?

更新:

我在 minikube 中有 运行 相同的容器,但我仍然遇到同样的问题...我日以继夜地努力解决这个问题,但还没有成功。我会及时通知你的。

1) 您对主机和容器中端口的引用是指 8888,但您包含的 link 表示 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 图片,它可能会帮助您开始使用您的图片:

我终于能够解决这个问题。这与 Spring Cloud Config 或我的 Spring Cloud Config 配置无关。仔细分析日志后,我看到来自 JGit 的错误如下:

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

openJDK 9 docker 图像似乎在其 cacerts 文件中缺少内容,从而阻止 JGit 成功建立到 bitbucket 的 https 连接,从而导致 NoSuchRepositoryException。我搜索了这个问题,发现这个 link 关于这个主题:

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

根据我在 link 中阅读的内容,建议使用 9-jdk-slim 而不是 9-jdk,因为 9-jdk- slim 没有空的 cacerts 文件。

在我的 Docker 文件中,我将 FROM 语句更改为使用 9-jdk-slim 而不是 9-jdk。我使用 Maven Fabric 8 插件重建了图像,运行 图像作为容器。我成功地能够通过 Spring Cloud Config 服务器从 Bitbucket 获取配置。这在 Docker for Mac 和 Minikube 中有效。我吸取的教训是在 Spring Boot 中完全启用日志记录,并通过仔细分析日志来解决此类问题。我希望这可以帮助其他遇到类似问题的开发人员。