Spring Cloud Samples Eureka – Docker – 在链接中使用下划线

使用Spring Cloud,Eureka和Docker可能会遇到一个有趣的exception情况。 我不确定我是否发现了一个问题,或者是否有预期的行为,但这里是要点。

我首先在一个名为docker的容器中运行尤里卡。 接下来,我使用ClientDiscoveryEnabled启动Docker客户端。 docker客户端容器使用docker“link”参数来获取到eureka容器中的主机名可访问性。 yaml文件有一个连接到属性驱动的Eureka的条目:

defaultZone: http://user:${eureka.password}@${host.name}:8761/eureka/ 

除非我尝试在容器名称中使用下划线,否则一切正常。 如果我使用下划线来命名我的容器,则客户端容器无法使用Eureka注册完全parsing此名称。 如果我删除下划线,一切工作正常。 也许我错过了一些东西,这是预料之中的,但是我还没有看到这个“特色”的提及。

我的客户基于Spring-Cloud-Samples feign-eureka项目。 以下是场景…

这将工作,客户将注册:

 sudo docker run -d -p=8761:8761 --name foobar chrisccoy/microsvcdemoeureka sudo docker run -d -p=7311:7311 --name democlnt --link foobar:foobar chrisccoy/microsvcdemoclnt java -jar /opt/tst/ms_clnt.jar --host.name=foobar 

以下将无法使用! 尤里卡将启动,客户端将启动,但不能注册:

 sudo docker run -d -p=8761:8761 --name foo_bar chrisccoy/microsvcdemoeureka sudo docker run -d -p=7311:7311 --name democlnt --link foo_bar:foo_bar chrisccoy/microsvcdemoclnt java -jar /opt/tst/ms_clnt.jar --host.name=foo_bar 

以下是日志条目和随后的exception:

 2015-02-25 18:51:27.762 ERROR 1 --- [pool-4-thread-1] com.netflix.discovery.DiscoveryClient : Can't get a response from http://user:password@foo_bar:8761/eureka/apps/HELLOCLIENT/172.17.0.11:HelloClient:7311 Can't contact any eureka nodes - possibly a security group issue? com.sun.jersey.api.client.ClientHandlerException: java.lang.IllegalArgumentException: Host name may not be null at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:184) at com.sun.jersey.api.client.filter.GZIPContentEncodingFilter.handle(GZIPContentEncodingFilter.java:120) at com.netflix.discovery.EurekaIdentityHeaderFilter.handle(EurekaIdentityHeaderFilter.java:28) at com.sun.jersey.api.client.Client.handle(Client.java:648) at com.sun.jersey.api.client.WebResource.handle(WebResource.java:680) at com.sun.jersey.api.client.WebResource.put(WebResource.java:211) at com.netflix.discovery.DiscoveryClient.makeRemoteCall(DiscoveryClient.java:1097) at com.netflix.discovery.DiscoveryClient.makeRemoteCall(DiscoveryClient.java:1060) at com.netflix.discovery.DiscoveryClient.access$500(DiscoveryClient.java:105) at com.netflix.discovery.DiscoveryClient$HeartbeatThread.run(DiscoveryClient.java:1583) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.IllegalArgumentException: Host name may not be null at org.apache.http.util.Args.notBlank(Args.java:65) at org.apache.http.HttpHost.<init>(HttpHost.java:81) at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.getHost(ApacheHttpClient4Handler.java:190) at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:170) ... 14 common frames omitted 

我可以在运行/ bin / bash的容器内ping通“foo_bar”,而不会出现问题。

 sudo docker run -i -t --link foo_bar:foo_bar chrisccoy/microsvcdemoclnt /bin/bash root@0175222c11bb:~# ping foo_bar PING foo_bar (172.17.0.12) 56(84) bytes of data. 64 bytes from foo_bar (172.17.0.12): icmp_seq=1 ttl=64 time=0.137 ms 

我不确定断开连接是从哪里来的。 或者,也许这是一个function,我不知道。

有任何想法吗?

看起来像java.net.URI不明白下划线在一个域名。 看到这个要点: https : //gist.github.com/spencergibb/ced5199c80f7a6c89499和这个http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6587184