尝试在Docker中运行Boot时,使用adzerk / boot-clj图像,我收到连接拒绝错误。
具体来说,当容器启动时,启动启动,然后输出堆栈跟踪。跟踪(在没有连接的计算机之间不容易复制和粘贴)主要与下载 - https://github.com/boot-clj/boot/releases/download/2.7.2/boot.jar - 以及接收“拒绝连接”错误有关。
我问,并回答这个问题,希望它可以帮助别人。
答案 0 :(得分:0)
从哪里开始?
我的主要问题是Docker + Clojure + Boot设置,特别是在从容器内部运行“boot”时。这样做会产生堆栈跟踪。这是我的旅程开始的地方。
我正在使用adzerk / boot-clj图片。我在本地(OSX)使用它没有问题,我遇到的问题是使用托管在企业数据中心内的VM(CentOS 7)。
docker run -ti adzerk/boot-clj
发出这个启动容器,入口点是Boot,它开始拉下一些罐子,特别是来自Github的boot.jar。最终的堆栈跟踪详细说明了几个问题,但其关键是
“java.net.ConnectException: Connection refused” (connecting to Clojars.org:443)
嗯...
因此,我没有直接在容器中运行Boot,而是将容器入口点指定为“—-entrypoint bash
”,这样我就可以稍微刺激一下。
所以,wget - 连接拒绝了。
没有Docker的方式怎么样?一样。拒绝连接。
在与网络团队进行了一些争吵后,我发现需要在CentOS上设置“https_proxy”env变量,以便将流量路由到互联网。这种情况对我来说是一个非常具体的问题。
...然而
wget现在很好,无论是在主机上还是在adzerk / boot-clj容器内。然而,引导不是。
为了简化事情,我把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。
它仍然没有用...... Arrrg。
好的,让我们把Boot拿出来。
我在Java中编写了一个测试工具,非常简单,连接到https://clojars.org并尝试读取索引页面。从https://docs.oracle.com/javase/tutorial/networking/urls/readingWriting.html复制,并设置JVM_OPTS。
它仍然失败。 “拒绝连接”
...。奇怪的胡子。
我终于偶然发现了这个问题 - 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/120797/how-do-i-set-the-proxy-to-be-used-by-the-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)
对不起我所有的亵渎行为。