我正在尝试运行gocd docker容器(https://hub.docker.com/r/gocd/gocd-server/)在集装箱站的QNAP(基于TS-451x86,固件4.2.0)上。
容器没有启动,并使用java.netUnknownHostException:进行轰炸
May 21 20:21:28 gocd-server-1 syslog-ng[16]: syslog-ng starting up; version='3.5.3'
using default settings from /etc/default/go-server
ERROR: Failed to start Go server. Please check the logs.
java.lang.RuntimeException: gocd-server-1: gocd-server-1
at com.thoughtworks.go.util.ExceptionUtils.bomb(ExceptionUtils.java:36)
at com.thoughtworks.go.server.util.GoSslSocketConnector.getHostname(GoSslSocketConnector.java:102)
at com.thoughtworks.go.server.util.GoSslSocketConnector.storeX509Certificate(GoSslSocketConnector.java:92)
at com.thoughtworks.go.server.util.GoSslSocketConnector.sslConnector(GoSslSocketConnector.java:56)
at com.thoughtworks.go.server.util.GoSslSocketConnector.<init>(GoSslSocketConnector.java:51)
at com.thoughtworks.go.server.Jetty9Server.sslConnector(Jetty9Server.java:133)
at com.thoughtworks.go.server.Jetty9Server.configure(Jetty9Server.java:76)
at com.thoughtworks.go.server.GoServer.configureServer(GoServer.java:84)
at com.thoughtworks.go.server.GoServer.startServer(GoServer.java:70)
at com.thoughtworks.go.server.GoServer.go(GoServer.java:63)
at com.thoughtworks.go.server.util.GoLauncher.main(GoLauncher.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.simontuffs.onejar.Boot.run(Boot.java:306)
at com.simontuffs.onejar.Boot.main(Boot.java:159)
Caused by: java.net.UnknownHostException: gocd-server-1: gocd-server-1
at java.net.InetAddress.getLocalHost(InetAddress.java:1496)
at com.thoughtworks.go.server.util.GoSslSocketConnector.getHostname(GoSslSocketConnector.java:100)
... 15 more
Caused by: java.net.UnknownHostException: gocd-server-1
at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
我检查了容器中的/etc/hosts-它包括正确的主机映射:10.0.3.2 gocd-server-1
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.0.3.2 gocd-server-1
hostname resovles correctly:
root@gocd-server-1:/tmp# hostname
gocd-server-1
容器映像很好-我在流浪的Ubuntuvm上运行了完全相同的gocd docker容器,没有任何问题
因此,这个问题在某种程度上与QNAP Linux(似乎是Ubuntu 4.1.2)有关
[~]#cat/proc/versionLinux 3.12.6版(root@NasX86-12)(gcc版本4.1.3 20070929(预发布版)(Ubuntu 4.1.2-1ubuntu2))#1 SMP 3月11日星期五CST 2016 02:20:16)
如何绕过java.netUnknownHostException异常有什么想法吗?
关闭这个线程:虽然我仍然不明白为什么会发生这种异常,但我想我找到了解决方法。因此,如果您是QNAP的所有者,并希望使用ContainerStation运行GOCD服务器,以下步骤可能会很有用:1.使用travix/gocd server:lastest image创建一个新容器(https://hub.docker.com/r/travix/gocd-server/)。该容器使用JDK8(而不是作为官方gocd容器的JDK7),此外还包括更多的配置选项(如果您在ContainerStation中创建容器时转到高级设置)。2.启动容器-您将得到异常-原因是:java.net.UnnknownHostException.
为什么?不知道,我确信我的/etc/hosts设置是正确的。事实上,我知道他们是正确的。
-
下一步-保持容器运行,但ssh到QNAP:
sshadmin@192.168.1.79(在我的情况下-将盒子的ip更改为您的)
//检查正在运行的映像:docker ps-
dde6ce0828868 travix/gocd server:最新"/doker entrypoint.s"21小时前21小时上21小时0.0.0.0:32793->8153/tcp,0.0.0.0:3279 2->8154/tcp gocd
// ssh into the container
docker exec -it dde6ce028868 bash
// run go-server start script
/usr/share/go-server/server.sh
让它运行,在我的情况下,它成功地启动了gocd。
清理工作目录rm-rf/var/lib/go服务器/work/
现在从ContainerStation 重新启动容器
在我的情况下,它正确启动,没有未知主机异常
为什么?(DNS缓存,权限,一些初始化会无声地失败吗?)
事实证明,这个问题与ACL有关,ACL只允许root用户读取/etc/hosts和/etc/resolv.conf。因此,在不同用户的容器内运行的java应用程序无法访问这些文件。
请。有关详细信息,请参阅此讨论:。
为什么我在Docker容器内拥有读取权限的文件上被拒绝权限?
如果你想将GOCD与QNAP一起使用,你可以尝试使用这个容器https://hub.docker.com/r/rshestakov/docker-gocd-server/
其中包括以下修复:
# modify ACL so go user would have read access
# to /etc/hosts and /etc/resolv.conf
# this is to avoid HostUnknown exception which happends
# when the gocd container is used on QNAP with ContainerStation
setfacl -m user:${USER_ID}:r /etc/resolv.conf
setfacl -m user:${USER_ID}:r /etc/hosts