欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-15 13:09:30
...

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

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

也就是说,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

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

docker run --user ${DOCKER_USER} --name mongo mongo