docker挂载volume的用户权限问题,理解docker容器的uid
在刚开始使用docker volume挂载数据卷的时候,经常出现没有权限的问题。
这里通过遇到的问题来理解docker容器用户uid的使用,以及了解容器内外uid的映射关系。
遇到的问题
本地有一个node的项目需要编译,采用docker来run npm install.
sudo docker run -it --rm --name ryan \
-v `pwd`:`pwd` \
-w `pwd` node \
npm install --registry=https://registry.npm.taobao.org
可以看到,install之后,node_modules文件的权限变成root了。那么,作为使用者的我们就没有权限去删除这个文件了。
为什么docker输出的文件权限会是root?
原因
Docker容器运行的时候,如果没有专门指定user, 默认以root用户运行。我们的node镜像的Dockerfile里没有指定user.
容器里的执行用户的id是0,输出文件的权限也是0.
容器共享宿主机的uid
首先了解uid,gid的实现。Linux内核负责管理uid和gid,并通过内核级别的系统调用来决定是否通过请求的权限。
比如,当一个进程尝试去写文件,内核会检查创建这个进程的的user的uid和gid,来决定这个进程是否有权限修