我正在尝试在集装箱站的QNAP(基于TS-451 x86,固件4.2.0)上运行gocd docker container(https://hub.docker.com/r/gocd/gocd-server/)。
容器没有'启动并用java.net.UnknownHostException轰炸:
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
容器图像没问题 - 我在流浪汉Ubuntu vm上运行完全相同的gocd docker容器,没有任何问题
所以问题与QNAP Linux(似乎是Ubuntu 4.1.2)有某种关系
[〜] #cat / proc / version Linux版本3.12.6(root @NasX86-12)(gcc版本4.1.3 20070929(预发布)(Ubuntu 4.1.2-16ubuntu2))#1 SMP Fri Mar 11 02:20:16 CST 2016)
如何解决java.net.UnknownHostException异常的任何想法?
答案 0 :(得分:0)
要关闭此线程:虽然我仍然不明白为什么会发生此异常,但我认为我找到了解决方法。因此,如果您是QNAP的所有者并希望使用ContainerStation运行GOCD服务器,则以下步骤可能会有用: 1.使用travix / gocd-server创建一个新容器:最新图像(https://hub.docker.com/r/travix/gocd-server/)。此容器使用JDK8(而不是JDK7作为官方gocd容器),还包括更多配置选项(如果在ContainerStation中创建容器时转到高级设置)。 2.启动容器 - 您将获得异常 - 引起:java.net.UnknownHostException。
为什么呢?不知道,我很确定我的/ etc / hosts设置是正确的。事实上我知道他们是对的。
下一步 - 保持容器正常运行,但ssh到您的QNAP:
ssh admin@192.168.1.79(在我的情况下 - 将盒子的IP改为你的)
//查看正在运行的图片: docker ps -a
dde6ce028868 travix / gocd-server:latest“/docker-entrypoint.s”21小时前上21小时0.0.0.0:32793->8153/tcp,0.0.0.0:32792->8154/tcp gocd < / p>
// 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-server / work /
现在从ContainerStation重新启动容器
在我的情况下,它正确启动没有未知的主机异常
任何理论为什么? (DNS缓存,权限,默认失败的一些初始化?)
答案 1 :(得分:0)
事实证明这个问题与ACL有关,它只对root用户提供对/ etc / hosts和/etc/resolv.conf的读访问权限。因此,在不同用户下的容器内运行的java应用程序无法访问这些文件。
请。有关更多信息,请参阅此讨论:。
why am I getting permission denied on file with read permissions inside Docker container?
如果您想将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