在QNAP中运行GOCD docker容器时获取java.net.UnknownHostException

时间:2016-05-21 20:42:27

标签: docker qnap go-cd

我正在尝试在集装箱站的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异常的任何想法?

2 个答案:

答案 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设置是正确的。事实上我知道他们是对的。

  1. 下一步 - 保持容器正常运行,但ssh到您的QNAP:

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

    //查看正在运行的图片: docker ps -a

  2. 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。

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

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

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

      任何理论为什么? (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