卷中的Docker自定义用户ID权限(已挂载和未挂载)

时间:2018-08-18 18:26:35

标签: docker dockerfile

在最新的MacOS上,使用Docker for Mac版本18.06.0-ce-mac70(26399)。

我构建了一个示例 Docker镜像,该镜像以创建了自定义用户的非root用户身份运行。这是 Dockerfile

FROM debian:jessie

RUN mkdir /data && \
    groupadd bar && useradd -d /home/foo -g bar -m -s /bin/bash foo && \
    chown foo:bar /data

VOLUME /data

USER foo

ENTRYPOINT ["/bin/bash"]

我制作了图像。称为test:1

我跑步时

docker run -it test:1 -c "ls -la /data"

我看到/data由用户 foo:bar 正确拥有。

我跑步时

docker run -it --user 1717:1818 test:1 -c "ls -la /data; touch /data/test"

我收到权限错误

total 8
drwxr-xr-x 2 foo  bar  4096 Aug 18 18:04 .
drwxr-xr-x 1 root root 4096 Aug 18 18:12 ..
touch: cannot touch '/data/test': Permission denied

如果我挂载主机目录

docker run -it --user 1717:1818 -v $(pwd)/data:/data test:1 -c "touch /data/test; ls -la /data"

它可以正常工作!

total 4
drwxr-xr-x 3 1717 1818   96 Aug 18 18:18 .
drwxr-xr-x 1 root root 4096 Aug 18 18:20 ..
-rw-r--r-- 1 1717 1818    0 Aug 18 18:20 test

现在我进入容器进行调试

docker run -it --user 1717:1818 test:1

我在外壳中。运行一些测试:

I have no name!@75deaf12dcdd:/$ id
uid=1717 gid=1818 groups=1818

I have no name!@75deaf12dcdd:/$ cat /etc/passwd
...
foo:x:1000:1000::/home/foo:/bin/bash

所以..最后是我的问题。

  • 为什么自定义用户(--user 1717:1818)的权限仅应用于已安装的卷?
  • 重要的一点::是否有一种方法可以在容器执行时(以非root用户身份运行)在所有文件和目录上应用自定义用户uid:gid?

2 个答案:

答案 0 :(得分:1)

ENTRYPOINT的一种非常典型的用法是将其设置为一个包装脚本,该脚本接收“ real”命令作为命令行参数。它会执行所需的任何设置,然后运行实际命令。

#!/bin/sh
chown -R ...
exec "$@"

然后,以与仅使用命令行即​​可运行基本映像的方式相同的方式,您可以运行自己的映像,而无需使用随机的-c参数

docker run ubuntu:18.04 ls -l /
docker run test:1 ls -l /

无论您的容器通常做什么,您都将其设置为CMD

COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
CMD ["my-server", "--foreground"]

如果您需要交互式外壳,则在启动实际外壳之前,您的入口点脚本必须进行设置。

docker run --rm -it test:1 sh

我相信绑定安装的卷的所有权更改是Docker for Mac特有的功能,这是Docker在无法直接使用OSX主机文件系统的隐藏Linux VM中运行的结果。有extended discussion in the Docker documentation,更具体地讲,包括容器chown为文件时发生的情况。

答案 1 :(得分:0)

我正在使用的当前解决方案使用以下 Dockerfile

FROM debian:jessie

RUN mkdir /data && \
    groupadd bar && useradd -d /home/foo -g bar -m -s /bin/bash foo && \
    chmod 777 /data

VOLUME /data

USER foo

ENTRYPOINT ["/bin/bash"]

我所做的就是在构建时将/data的权限更改为777(chmod 777 /data而不是chown foo:bar /data)。
这使我的容器可以写入已安装的/data(该主机由主机上的 1717:1818 拥有)。

docker run -it --user 1717:1818 test:1 -c "touch /data/test; ls -la /data"

现在有效:

total 8
drwxrwxrwx 2 1717 1818 4096 Aug 21 20:15 .
drwxr-xr-x 1 root root 4096 Aug 21 20:21 ..
-rw-r--r-- 1 1717 1818    0 Aug 21 20:21 test

我很高兴在/data上听到关于摆脱 777 的想法的想法

我希望这会有所帮助。

相关问题