Docker 对于 Windows 和 docker-maven-plugin - "SSLException: Unrecognized SSL message, plaintext connection" 错误

Docker for Windows and docker-maven-plugin - "SSLException: Unrecognized SSL message, plaintext connection" error

我正在使用 Docker Desktop for Windows v1.13.0 和 docker-maven-plugin v0.4.13 在我本地 Windows 10 Pro 机器上。我正在使用 mvn clean package docker:build 构建我的项目并生成 docker 图像。构建失败:

[INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 25.006 s [INFO] Finished at: 2017-01-19T14:48:45-02:00 [INFO] Final Memory: 68M/619M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal com.spotify:docker-maven-plugin:0.4.13:build (default-cli) on project monitoramentoRS: Exception caught: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? -> [Help 1]

直接在命令行上创建 docker 图像 (docker build -t ...) 效果很好。 Maven 插件在 Docker 工具箱和 Windows 7 上的 Oracle Virtual Box 上运行良好。

因此,我认为 docker-maven-plugin 和 Windows 守护程序的 Docker 之间存在与 TLS 相关的配置问题。我尝试了使用 DOCKER_HOST(无端口指示,2375、2376)、DOCKER_TLS_VERIFYDOCKER_TLS 的不同配置组合,但均无济于事。还为 Windows 守护程序配置尝试了 "advanced" Docker 的 "tls""tlsverify" 属性。

有没有人能够让 docker-maven-plugin 在 Docker 上为 Windows 创建一个 docker 图像?

我的 %HOME%\.docker\config.json 文件只包含一个 auths 集合:

{
    "auths": {
        "our-corporate-private-docker-registry-address": {
            "auth": "an-authorization-token"
        },
        "https://index.docker.io/v1/": {
            "auth": "an-authorization-token"
        }
    }
}

下面是 docker-maven-plugin 配置。

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.4.13</version>
    <configuration>
        <useConfigFile>false</useConfigFile> <!-- true yields the same error -->
        <registryUrl>${docker.private.registry}</registryUrl>
        <imageName>${docker.private.registry}/myrepo/myimage</imageName>
        <imageTags>
            <imageTag>latest</imageTag>
        </imageTags>
        <dockerDirectory>${basedir}/docker</dockerDirectory>  <!-- Dockerfile location -->
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>                                           <include>${project.build.finalName}.${project.packaging}</include>
            </resource>
        </resources>
    </configuration>
</plugin>

%HOME%.docker 下可能有一些配置元素影响与 docker-maven-plugin 的通信。尝试删除您的 %HOME%.docker 文件夹并重新启动 docker。 之后,运行

oc login -u user https://url-to-openshift:port --insecure-skip-tls-verify

docker login -u user -p token url-to-private-registry

然后打开 %HOME%.docker 如果你的文件是这样的:

{
   "auths": {
      "url-to-private-registry": {}
   },

   "credsStore": "wincred"    
}

然后删除 credsStore 部分,因为 spotify docker-maven-plugin 不支持它。

示例:

{
   "auths": {
      "url-to-private-registry": {}
   }
}

当您 运行 docker 再次登录时,它将再次生成令牌,您应该不会有任何身份验证问题。

登录后,您的 %HOME%.docker\config.json 将如下所示:

{
   "auths": {
      "url-to-private-registry": {
          "auth:" "token-that-docker-maven-plugin-needs-when-property-useConfigFile-is-true"
      }
   }
}

至少,它对我有用。