docker容器运行时生成的文件,宿主机上显示所有者是root用户,无权限问题

问题描述

docker容器中生成的文件,在宿主机上无法操作。在宿主机上通过ll命令可以看到,它的拥有者是root,而我们一般工作中很少能有root权限,甚至删除都必须再去镜像里操作。

原因描述

这里存在一个docker容器非常奇怪的实现。

在存在挂载的情况下:

容器中如果使用root用户生成的文件,即在容器中的所有者是root,那么它在宿主机中,所有者也是宿主机的root用户,即容器内外的权限一致。其他用户同理。

内外对用户的标识采用id进行映射。即:容器内id=1000的用户与宿主机id=1000的用户是对应的。即使容器内外相同id对应的用户名不同。

可选方案

方案一: 在容器中使用与宿主机相同的用户id进行操作

方案二: 在容器中使用root用户操作,并在容器中更改生成的文件的权限

方案一

使用方法

  • docker命令中, docker run -it -u $(id -u):$(id -g) llama-factory-llama-factory /bin/bash

  • docker-compose.yml中,设置services.user=$(id -u):$(id -g)

$id -uid -g获取当前用户的id和用户组id

缺点

一些代码很可能需要访问/目录,非root用户没有权限

THUDM/ChatGLM2-6B项目为例,需要访问/.cache/.triton(其实一般大模型训练都需要访问这两个地址),代码会报错。这时候需要将这些目录挂载出去,或者给当前用户所需要的权限。

以上面的命令为例,需要修改为:

docker run -it -u $(id -u):$(id -g) -v ./.cache:/.cache -v ./.triton:/.triton llama-factory-llama-factory /bin/bash

方案二

使用方法

在容器中使用root用户操作,并在容器中更改生成的文件的权限

即:大多数镜像,启动后不指定用户,默认是用root进入,在生成完文件后,修改文件的权限

bash 复制代码
chown 1000:1000 /path/to/file_or_directory
chmod 755 /path/to/file_or_directory

这里的1000:1000指的是宿主机的用户id组id

缺点

每个文件都需要去赋权,很麻烦。如果只是为了少数文件可以用此方法。毕竟它省去了一些无用的挂载,减少了对宿主机的污染。

疑问

为什么不能设计成这样:

宿主机上,哪个用户下使用docker指令,docker生成的文件就是哪个用户的权限,即容器中的root权限与宿主机的用户权限对应。

相关推荐
喜欢你,还有大家2 小时前
Docker-仓库-镜像制作
运维·docker·容器
武子康4 小时前
Java-166 Neo4j 安装与最小闭环 | 10 分钟跑通 + 远程访问 Docker neo4j.conf
java·数据库·sql·docker·系统架构·nosql·neo4j
计算机小手8 小时前
使用 llama.cpp 在本地高效运行大语言模型,支持 Docker 一键启动,兼容CPU与GPU
人工智能·经验分享·docker·语言模型·开源软件
岚天start8 小时前
KubeSphere在线安装单节点K8S集群
docker·容器·kubernetes·k8s·kubesphere·kubekey
xyhshen8 小时前
记录一次K8S跨命名空间访问 xxx.xxx.svc.cluster.local 类似内部服务不通的问题
云原生·容器·kubernetes
栗子~~8 小时前
shell-基于k8s/docker管理容器、监控模型训练所消耗的最大CPU与最大内存脚本
docker·容器·kubernetes
海鸥818 小时前
在k8s中部署seaweedfs,上传文件到seaweedfs方法
云原生·容器·kubernetes
半梦半醒*8 小时前
k8s——pod详解2
linux·运维·docker·容器·kubernetes·负载均衡
AAA小肥杨8 小时前
K8s从Docker到Containerd的迁移全流程实践
docker·容器·kubernetes
DARLING Zero two♡8 小时前
云原生基石的试金石:基于 openEuler 部署 Docker 与 Nginx 的全景实录
nginx·docker·云原生