为什么 Dockerfile 中的 umask 设置无效?

3
我希望我的Docker容器中的某些目录具有特定的umask值,比如000。我尝试在Dockerfile和ENTRYPOINT shell脚本中设置了它们,但都未能生效。
...
RUN umask 000 /var/www/html/storage/logs //the directory
ENTRYPOINT  ["/etc/start.sh"]

#in the /etc/start.sh
#!/bin/sh
umask 000 /var/www/html/storage/logs
...

当我登录到 Docker 容器并检查 /var/www/html/storage/logs 的 umask 时,它仍然是默认的 0022。

/var/www/html # cd storage/logs/
/var/www/html/storage/logs # umask
0022

为什么会这样?我该如何使其正常工作?谢谢!


1
"umask" 设置当前进程的 umask 值,并对所有在 umask 命令之后创建的文件产生影响。命令后指定的文件名不起任何作用。一旦当前进程退出,umask 值就会丢失。 - Hans Kilian
但我已经在ENTRYPOINT中设置了它,但它仍然没有起作用。 - Qiulang
1个回答

6

umask 是进程的属性,不是目录的属性。像其他进程相关的特性一样,在每个 RUN 命令结束时都会重置。

如果您想让非 root 用户可以写入目录,最好的选择是将其 chown 给该用户。(Ask Ubuntu 上如何为特定文件夹设置 umask 有一些其他的选择。)如果目录最终是一个绑定挂载点或卷挂载点,则这些操作都无关紧要;所有挂载目录的特性都会替换 Dockerfile 中发生的任何操作。

如果您确实需要更改 umask,唯一可以真正执行此操作的地方是入口点包装脚本。主容器进程也可以自行设置。

#!/bin/sh
# entrypoint.sh
umask 000
# ... other first-time setup ...
exec "$@"

我在ENTRYPOINT shell脚本中设置了它。但是在阅读了您的答案之后,我意识到因为我在另一个进程中运行docker exec -it sh来登录容器,所以看到目录的umask更改为022了,对吗? - Qiulang
docker exec 调试 shell 不是主容器进程的子进程,它们不会看到您在 entrypoint 脚本中进行的设置。但如果您运行 docker run --rm -it your-image sh,那么新容器将具有通过 entrypoint 序列启动的交互式 shell。 - David Maze
我刚刚发现我前几天问了一个愚蠢的问题 :$。谢谢你回答我的问题。 - Qiulang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接