当尝试使用adzerk/Boot clj映像在Docker内部运行Boot时,我收到拒绝连接的错误。
具体来说,当容器启动时,启动,然后输出堆栈跟踪。跟踪(在没有连接的计算机之间不容易复制和粘贴)本质上与下载有关——https://github.com/boot-clj/boot/releases/download/2.7.2/boot.jar-并接收到"拒绝连接"错误。
我问并回答这个问题,希望它能帮助其他人。
从哪里开始?
我的主要问题是Docker+Clojure+Boot设置,特别是在从容器内部运行"引导"时。这样做会喷出一个堆栈痕迹。这就是我旅程的起点。
我正在使用adzerk/boot-clj映像。我在本地(OSX)使用过它,没有遇到任何问题,我遇到的问题是在使用公司数据中心内托管的VM(CentOS 7)。
docker run -ti adzerk/boot-clj
发出这个命令会启动容器,入口点是Boot,它开始从Github中取出一些jar,特别是Boot.jar。生成的堆栈跟踪详细说明了几个问题,但关键是
“java.net.ConnectException: Connection refused” (connecting to Clojars.org:443)
嗯…
因此,我没有直接在容器中运行Boot,而是将容器入口点指定为"—-entrypoint bash
",这样我就可以四处走动了。
因此,wget连接被拒绝。
没有Docker怎么办。同样的事情。连接被拒绝。
经过与网络团队的一番争论,我发现"https_proxy"env变量需要在CentOS上设置,才能将流量路由到互联网。对我来说,这是一个非常具体的问题。
然而…。
wget现在在主机上和adzerk/boot-clj容器内都很好。但Boot并没有。
为了进一步简化事情,我将Docker完全排除在等式之外,并在本地使用引导。
已安装java-1.8.0-openjdk.x86_64,已安装Boot。同样的问题。
所以仔细搜索了一下,发现了这个-https://github.com/boot-clj/boot-bin/issues/2
这是一个开始。它提到设置BOOT_JVM_OPTIONS,特别是https.proxyHost和https.proxyPort.
它仍然没有起作用…阿尔格。
好吧,让我们把Boot排除在等式之外。
我用Java编写了一个测试工具,非常简单,它连接到https://clojars.org并尝试读取索引页面。从https://docs.oracle.com/javase/tutorial/networking/urls/readingWriting.html复制,并设置JVM_OPTS。
它仍然失败。"连接被拒绝">
…。奇怪的胡子。
我终于偶然发现了这个SO-https://stackoverflow.com/questions/43695299/java-httpurlconnection-works-on-windows-and-fails-on-linux-特别是Stephen C 的答案
"Java不一定尊重您系统的默认代理设置。由于您可以在Linux机器上"卷曲"URL,最有可能的解释是Java没有使用您配置的代理。以下链接解释了为Java配置代理的各种方法:">
因此,使用第一个链接-https://stackoverflow.com/questions/1207797/how-do-i-set-proxy-to-be-used-by-jvm-以及Leonel 的答案
我发布了"java -Dhttps.proxyHost=xxx -Dhttps.proxyPort=80 HelloWorld
">
我犯了一个错误,但不一样。这就是进步。"无法通过代理进行隧道传输">
我在谷歌上快速浏览了一下:http://www.oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html-"禁用HTTPS隧道的基本身份验证">
因此更新为"java -Dhttps.proxyHost=xxx -Dhttps.proxyPort=80 -Djdk.http.auth.tunneling.disabledSchemes=“” HelloWorld
利润。
信息:
java -v
openjdk version 1.8.0_144
Openjdk Runtime Environment (build 1.8.0_144-b01)
OpenJDK 64-Bit Server VM (build 25.144-b01, mixed mode)
抱歉我的脏话。