在最新的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
所以..最后是我的问题。
答案 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 的想法的想法
我希望这会有所帮助。