【问题标题】:Why is umask setting in dockerfile not working?为什么 dockerfile 中的 umask 设置不起作用?
【发布时间】:2021-09-18 10:07:28
【问题描述】:

我希望我的 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/logsumask,还是默认的0022

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

这是为什么呢?我如何使它工作?谢谢!

【问题讨论】:

  • umask 设置当前进程的 umask 值,并影响 umask 命令后创建的所有文件。您在命令后指定的文件名不执行任何操作。一旦当前进程退出,umask 值就会丢失。
  • 但我确实在 ENTRYPOINT 中设置了它,它也不起作用。

标签: docker dockerfile umask


【解决方案1】:

umask 是进程 的属性,而不是目录。与其他与进程相关的特征一样,它将在每个RUN 命令结束时重置。

如果您试图让非 root 用户可以写入目录,最好的选择是 chown 给该用户。 (Ask Ubuntu 上的How to set umask for a specific folder 有一些进一步的选择。)如果目录最终是绑定挂载点或卷挂载点,这些都无关紧要;挂载目录的所有特征都将替换 Dockerfile 中发生的任何内容。

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

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

【讨论】:

  • 我确实在 ENTRYPOINT shell 脚本中设置了它。但是在阅读了您的答案后,我意识到因为我在另一个进程中运行 docker exec -it sh 以登录到容器,所以我看到目录的 umask 更改为022,对吧?
  • docker exec 调试 shell 不是主容器进程的子进程,它们不会看到您在入口点脚本中执行的设置。但是,如果您 docker run --rm -it your-image sh,则该新容器将具有通过入口点序列启动的交互式 shell。
  • 我刚刚发现前几天我问了一个愚蠢的问题:$。感谢您回答我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
相关资源
最近更新 更多