解决 Docker 数据卷挂载的文件权限问题

"博客探讨了Docker在启动时如何根据Dockerfile指定的USER运行程序,若未指定则默认以ROOT启动。由于docker用户与宿主机用户共享userid,这可能导致文件权限问题。解决方案是在运行docker时使用`-u${USER}
摘要由CSDN通过智能技术生成

Docker在启动的时候,会根据Docker File 里的USER运行程序。
如果没有指定,会默认以ROOT进行启动。

注意到,在文件权限层面,docker 的用户、用户组是与宿主机相通的,虽然名字可能不一样,但共用一个userid。

如果深究原因,就要讨论到 linux 的空间隔离原理了,偏题太远。我们可以简单的这么理解:Linux的文件存储结构里,文件内容+文件属性(包括它的权限)是在一块儿的。docker产生的文件,“宿主机” 在同一操作系统的前提下,自然能无缝识别。

也就是说,docker默认的root,id是1,那么对应的就是宿主机的root(userid 也是 1)
如果 docker的默认用户是 new_user,id是1001,那么对应到的就是宿主机的 1001号用户,是哪位并不知道,不一定叫new_user。

假设是以ROOT启动的,那么在程序运行的过程中,我们挂载盘符之后,产生的一些中间文件的权限在宿主机看来就是id为1的用户的,也就是本机的ROOT的。

而一般我们基本不可能直接用root来操作docker,这样产生的文件我们都是无权限操作的,显然不能接受。

有什么办法修改呢?

有。

只要在 docker run 时,使用 -u ${USER} 来绑定用户就好。这样docker容器内部,就会用这个用户来启动默认进程了。

不过这个指令的使用有一个误区,如果 ${USER} 使用的是用户名,而docker容器里并没有预先初始化好这个用户,就会出现用户找不到的情况:

docker: Error response from daemon: unable to find user publisher: no matching entries in passwd file.

这时候用 userid 就可以了。这样docker容器就不会去解析用户名,得到userid,再对文件进行操作。

总结一下:

如果是使用外部正在登录的用户来对docker进行操作,那么用 -u userid 来进行,比如:

docker run --user $(id -u) --name mongo mongo

光是这样其实还不够,最好带上组信息,这样权限才是100%还原启动者的。

docker run --user $(id -u):$(id -g) --name mongo mongo

如果是使用特定的、docker容器里面的角色(比如jenkins),那么用 -u username 来进行,比如:

docker run --user ${DOCKER_USER} --name mongo mongo
回答: 当使用docker进入容器后,挂载的文件可能会出现无权限的情况。这是因为默认情况下,docker容器是不允许挂载文件系统的。为了解决这个问题,可以使用nsenter工具来操作容器。通过nsenter,我们可以在docker容器中执行任意的命令,获取root权限,而不受到安全限制的干扰。这样就可以解决挂载文件无权限问题。\[1\] 另外,当在容器内部创建或修改文件时,可能会提示没有权限的错误。这是因为容器内部的文件系统权限限制。为了解决这个问题,可以在运行容器时使用docker命令的-v参数,允许容器内文件与宿主机之间进行双向映射。这样可以修改文件时不需要进入容器内部,直接在宿主机上进行修改。同时,这也可以实现数据的持久化,避免容器删除后数据丢失的情况。以Nginx为例,可以使用-v参数来进行文件映射。\[2\]\[3\] #### 引用[.reference_title] - *1* [Docker应用教程-挂载运行中的docker容器中挂载文件系统](https://blog.csdn.net/weixin_36473855/article/details/112015325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [docker挂载目录,容器无操纵权限](https://blog.csdn.net/weixin_42181179/article/details/128650146)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [一起学DockerDocker容器文件的挂载方法一](https://blog.csdn.net/ren365880/article/details/123858745)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值