Spring Boot with docker 无法找到请求目标错误的有效认证路径

Posted

技术标签:

【中文标题】Spring Boot with docker 无法找到请求目标错误的有效认证路径【英文标题】:Spring boot with docker unable to find valid certification path to requested target error 【发布时间】:2017-01-07 12:14:24 【问题描述】:

我正在使用 Spring Boot,并尝试使用 Docker 进行设置。我已经尝试了所有可以在谷歌上找到的东西,但似乎没有什么能让我继续前进。我跑了

 mvn clean package docker:build 

运行它会执行 spring-boot 测试、运行 DB 迁移、构建 JAR,然后在构建 Docker 映像时,我会得到以下信息错误:

Failed to execute goal com.spotify:docker-maven-plugin:0.4.9:build (default-cli) 
on project app: Exception caught: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: javax.net.ssl.SSLHandshakeException: 
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target -> [Help 1]

这是我正在使用的 Dockerfile:

FROM java:8-jdk
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/james/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
EXPOSE 8080
VOLUME /tmp
ADD app-0.0.1-SNAPSHOT.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

这是我的 docker-maven-plugin 配置:

 ... pom stuff
<docker.image.prefix>jamesone1</docker.image.prefix>
    ... other pom stufff
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.4.9</version>
    <configuration>
            <dockerHost>https://192.168.99.100:2376</dockerHost>
            <imageName>$docker.image.prefix/$project.artifactId</imageName>
            <dockerDirectory>src/main/docker</dockerDirectory>

            <resources>
                <resource>
                    <targetPath>/</targetPath>
                    <directory>$project.build.directory</directory>
                    <include>$project.build.finalName.jar</include>
                </resource>
            </resources>
    </configuration>
</plugin>

我正在使用适用于 mac 的扩展坞,并且正在使用具有以下环境的 docker-machine

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/james/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"

这是怎么回事?!我错过了什么吗?

【问题讨论】:

***.com/questions/9210514/… 【参考方案1】:

我最终在没有插件的情况下自己构建了 docker 映像:

docker build -f Dockefile .

还有我的 Dockefile(已重命名):

FROM java:8-jdk
EXPOSE 8080
#VOLUME /tmp

ADD target/app-0.0.1-SNAPSHOT.jar /opt/demo/app-0.0.1-SNAPSHOT.jar
CMD ["java","-jar","/opt/demo/app-0.0.1-SNAPSHOT.jar"]

然后我像这样运行它:

 docker run <container id here>

我就是无法让 mvn 插件工作!

编辑

此外,我最终创建了一个docker-compose.yml,这让事情变得简单多了!!!

您定义属性,例如要打开的端口、dockerfile 位置,然后运行 ​​docker-compose,它会神奇地构建+运行 docker 映像!

我正在使用的示例 docker-compose.yml:

version: '2'
services:
  web:
    build: .
    ports:
     - "8080:8080"

build 引用 Dockerfile 位置。 *请注意,您可能需要将 Dockerfile+yml 文件放在同一位置!

ports 引用我想要打开的端口。现在我可以转到 localhost:8080 并且我的请求将被转发到 docker 容器。

在此处阅读有关 docker 容器的更多信息:

https://docs.docker.com/compose/gettingstarted/

【讨论】:

【参考方案2】:

通过以下方式在 Windows 10 中修复了此问题:

        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>0.4.13</version>
            <configuration>
                <imageName>yourImageName</imageName>
                <dockerDirectory>src/main/docker</dockerDirectory>
                <dockerHost>https://192.168.99.100:2376</dockerHost>
                <dockerCertPath>/Users/your_user/.docker/machine/machines/default</dockerCertPath>
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <directory>$project.build.directory</directory>
                        <include>$project.build.finalName.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>

这两个标签很重要:

<dockerHost>https://192.168.99.100:2376</dockerHost>
<dockerCertPath>/Users/your_user/.docker/machine/machines/default</dockerCertPath>

我正在使用一个 dockerfile,你必须用这个标签定义哪个路径:

<dockerDirectory>src/main/docker</dockerDirectory>  

现在您可以通过以下方式构建您的 jar 并生成 docker 映像:

mvn 打包 docker:build

我认为在 mac 上只是以下值必须不同:

<dockerCertPath>/Users/your_user/.docker/machine/machines/default</dockerCertPath>

【讨论】:

roak1997 不客气。你是在 Mac 还是 Windows 上运行它? 使用 Docker For Windows 时的 dockerHost URL 是什么?

以上是关于Spring Boot with docker 无法找到请求目标错误的有效认证路径的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot with docker 无法找到请求目标错误的有效认证路径

Spring Boot Devtools 自动重启错误

Spring Security with Boot

RSS Feeds with Spring Boot

《Pro Spring Boot 2》第四章:Web Applications with Spring Boot

《Pro Spring Boot 2》第五章:Data Access with Spring Boot