1

我正在尝试在容器站的 QNAP(基于 TS-451 x86,固件 4.2.0)上运行 gocd docker 容器( 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

容器映像很好 - 我在 vagrant Ubuntu vm 上运行了完全相同的 gocd docker 容器,没有任何问题

所以这个问题在某种程度上与 QNAP Linux(这似乎是 Ubuntu 4.1.2)有关

[~] # cat /proc/version Linux version 3.12.6 (root@NasX86-12) (gcc version 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)) #1 SMP Fri Mar 11 02:20: 16 CST 2016)

任何想法如何解决 java.net.UnknownHostException 异常?

4

2 回答 2

0

事实证明,这个问题与 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
于 2016-06-05T18:17:16.827 回答
0

关闭此线程:尽管我仍然不明白为什么会发生此异常,但我想我找到了解决方法。因此,如果您是 QNAP 的所有者并希望使用 ContainerStation 运行 GOCD 服务器,以下步骤可能会很有用: 1. 使用 travix/gocd-server:lastest 映像创建一个新容器 ( https://hub.docker.com/ r/travix/gocd-server/)。这个容器使用 JDK8(而不是 JDK7 作为官方的 gocd 容器)加上它包括更多的配置选项(如果你在 ContainerStation 中创建容器时进入高级设置)。2. 启动容器 - 你会得到异常 - Caused by: java.net.UnknownHostException。

为什么?不知道,我很确定我的 /etc/hosts 设置是正确的。事实上,我知道他们是正确的。

  1. 下一步 - 保持容器运行,但通过 ssh 连接到您的 QNAP:

    ssh admin@192.168.1.79 (在我的情况下 - 将盒子的 ip 更改为你的)

    // 检查正在运行的图像: docker ps -a

dde6ce028868 tavix/gocd-server:latest "/docker-entrypoint.s" 21 小时前 21 小时前 0.0.0.0:32793->8153/tcp, 0.0.0.0:32792->8154/tcp gocd

// ssh into the container  
docker exec -it dde6ce028868 bash

// run go-server start script 
/usr/share/go-server/server.sh 

让它运行,就我而言,它成功启动了 gocd。

  1. 清理工作目录 rm -rf /var/lib/go-server/work/

  2. 现在从 ContainerStation 重新启动容器

在我的情况下,它可以正确启动而没有未知的主机异常

任何理论为什么?(DNS 缓存、权限、一些静默失败的初始化?)

于 2016-05-29T19:32:05.577 回答