我有一个docker容器,它在容器内的用户帐户'go'下运行GOCD服务器(java app)。
此容器将/ etc / hosts安装为644(对所有用户都可读)但“go”帐户似乎无法读取此文件。
这是证据:
[~] # docker -v
Docker version 1.10.2, build 0762ca4
# first enter the container as root and read the contents of
# /etc/hosts
~] # docker exec -it 0dac9bf0eab5 bash
root@gocd:/# ls -la /etc/hosts
-rw-r--r--+ 1 root root 164 Jun 2 22:03 /etc/hosts
#no problem - file is readable
root@gocd:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
10.0.3.2 gocd
root@gocd:/#
# now change user to 'go'
root@gocd:/# su - go -c bash
go@gocd:/$ id
uid=999(go) gid=999(go) groups=999(go)
# check permissions - still 644
go@gocd:/$ ls -la /etc/hosts
-rw-r--r--+ 1 root root 164 Jun 2 22:03 /etc/hosts
# but trying to read the file - causes error:
go@gocd:/$ cat /etc/hosts
cat: /etc/hosts: Permission denied
为什么会发生这种情况?
答案 0 :(得分:0)
该问题与ACL权限有关,ACL权限仅限于对/ etc / hosts和/etc/resolv.conf的READ访问权限。
结果,在容器内的任何其他帐户下运行的应用程序无法读取这些文件,这会导致网络堆栈出现问题。例如,需要将主机解析为ip的java应用程序将获得UnknownHost异常。
如果使用ContainerStation创建容器,则会在QNAP系统中发生此问题。 ContainerStation中似乎没有任何设置可以更改此行为,但可以使用添加到容器中的启动脚本的以下命令进行修复:
# 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
对于想要运行GOCD服务器的QNAP用户,我在docker hub上创建了一个docker容器,该容器已包含此修复程序: