为什么我在Docker容器中获得读取权限的文件被拒绝?

时间:2016-06-02 22:40:22

标签: docker

我有一个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

为什么会发生这种情况?

1 个答案:

答案 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容器,该容器已包含此修复程序:

https://hub.docker.com/r/rshestakov/docker-gocd-server/