[problem help] Docker 怎样设置容器的umask? Resolved
Tofloor
poster avatar
138******17
deepin
2024-11-11 23:46
Author

目前容器在使用 docker-compose.yml 管理,容器生成的文件是755,我想让容器生成的文件权限为775,这该如果修改umask。

容器中运行账户是 /sbin/nologin ,没有家目录,所以无法通过修改.profile文件来改变umask值。

试过改容器中的 /etc/profile文件和 /etc/bash.bashrc 文件都没见起作用。

===========================================

已解决,解决办法。

在进入容器,修改根目录下的 entrypoint.sh 文件,在文件中增 umask 002

Reply Favorite View the author
All Replies
raspbian
deepin
2024-11-12 09:49
#1

以下是几种可以让以 root 启动的 Docker 容器内创建的所有文件能被宿主机普通用户访问的方法:

挂载数据卷并设置权限

  • 在启动容器时,使用 -v 参数将宿主机的目录挂载到容器内的目录。例如,假设宿主机上有一个目录 /home/user/shared,想要挂载到容器内的 /app/data 目录,可以这样启动容器:
docker run -v /home/user/shared:/app/data -u root:$(id -u) your_image_name

其中 $(id -u) 会获取宿主机当前用户的 UID,这样容器内的 root 用户就会使用与宿主机普通用户相同的 UID 来创建文件,从而保证容器内创建的文件在宿主机上能被该普通用户访问。

自定义容器内的文件权限

  • 在容器的启动脚本中,可以添加命令来修改容器内创建文件的默认权限。例如,在容器内的 Dockerfile 中的 ENTRYPOINTCMD 指令前添加以下命令:
RUN umask 0002

这会将容器内的文件创建掩码设置为 0002,使得新创建的文件具有组可写权限,从而让宿主机上属于该组的普通用户能够访问。

使用 Dockerfile 中的 USER 指令

  • Dockerfile 中,可以使用 USER 指令来切换到一个非 root 用户来运行容器中的进程。首先创建一个与宿主机普通用户具有相同 UID 和 GID 的用户,然后在 Dockerfile 中使用 USER 指令切换到该用户,例如:
FROM your_base_image
RUN groupadd -g $(id -g) user_group && useradd -u $(id -u) -g user_group user_name
USER user_name
# 后续的容器内操作将以该用户执行,创建的文件权限将与宿主机普通用户匹配

挂载共享目录并修改权限

  • 先创建一个宿主机和容器都能访问的共享目录,然后在容器启动时将其挂载到容器内。在容器启动后,在容器内修改该挂载目录及其子目录和文件的权限,使其能被宿主机普通用户访问。例如:
docker run -v /shared:/container_shared your_image_name
# 进入容器后执行以下命令
chmod -R 775 /container_shared

这样,容器内 /container_shared 目录下创建的所有文件都能被宿主机上具有相应权限的普通用户访问。

使用 ACL(访问控制列表)

  • 如果宿主机文件系统支持 ACL,可以在挂载目录时设置 ACL 权限,以允许宿主机普通用户访问容器内创建的文件。例如,在宿主机上执行以下命令来设置挂载目录的 ACL 权限:
setfacl -m u:your_username:rwx /path/to/mount/directory

然后在启动容器时将该目录挂载到容器内,容器内创建的文件就会继承该目录的 ACL 权限,从而使宿主机普通用户能够访问。

以上方法可以根据具体的需求和环境选择使用,通过合理设置权限和挂载,可以实现容器内文件与宿主机普通用户之间的正常访问。

Reply View the author