【发布时间】:2016-10-25 09:54:22
【问题描述】:
我使用以下 Dockerfile 基于 centos:6.8 映像创建了一个容器:
FROM centos:6.8
RUN adduser -m test
USER test
然后使用 docker build 构建映像:
docker build -t dockerdemo .
然后我启动一个容器:
docker run -ti dockerdemo bash
当我在容器内时,我似乎能够以“测试”用户的身份写入容器的根目录:
[test@9af9c4aeb990 /]$ ls -ld /
drwxr-xr-x 29 root root 4096 Oct 25 09:49 /
[test@9af9c4aeb990 /]$ id -a
uid=500(test) gid=500(test) groups=500(test)
[test@9af9c4aeb990 /]$ touch /test-file
[test@9af9c4aeb990 /]$ ls -l /test-file
-rw-rw-r-- 1 test test 0 Oct 25 09:49 /test-file
我希望在运行touch 命令时看到Permission denied。
如果我更改 Dockerfile 并删除 USER 语句并重建,那么我可以将 su 发送给容器内的“测试”用户,我会得到我期望的行为:
[root@d16277f693d8 /]# su - test
[test@d16277f693d8 ~]$ id
uid=500(test) gid=500(test) groups=500(test)
[test@d16277f693d8 ~]$ ls -ld /
drwxr-xr-x 29 root root 4096 Oct 25 09:50 /
[test@d16277f693d8 ~]$ touch /test-file
touch: cannot touch `/test-file': Permission denied
我是否误解了用户权限在容器内的工作方式?
有没有办法产生我的预期行为?
【问题讨论】:
-
如果你通过侧门/后门进入“容器内部”,而不是正常进程(cmd/入口点)——你不是测试。做一个 whoami 来验证。
-
我不太清楚您所说的“通过侧门/后门”是什么意思。我从“docker run -ti image-name bash”开始。
-
我的意思是,如果您只是执行 docker run image-name,它会像宣传的那样工作。来自文档: USER 指令设置运行映像时使用的用户名或 UID,以及 Dockerfile 中跟随它的任何 RUN、CMD 和 ENTRYPOINT 指令。您正在运行没有上述任何内容的容器。
-
我使用 docker run 来启动容器。我已经更新了原始描述,以便明确说明我使用的命令。
标签: permissions docker