问题

docker容器挂载目录下部分文件,在容器外没有权限进行移动删除等操作。

原因

docker容器内与服务器共享同一个linux内核,验证权限时只认uid和gid(相关知识参照https://www.jianshu.com/p/5cca9ab67461),所以不管用户名是什么,对一个特定文件的所有者,容器内外都是只认相应的uid的。

启动docker容器时如果不指定用户,则会默认为root用户,如果在容器内对挂载目录下的文件进行了操作,则相应文件的所有者就会升级为root,在容器外如果只有非root用户的权限,就无法对这些文件进行操作了。

而通常我们在公用的服务器上操作时,一般都不会拥有root权限,因此两个方法解决这个问题:

  1. 启动docker容器时,用-u 参数指定用户:
docker run (省略其余参数) -u uid -it container_name bash

因为容器内部是不知道某个uid具体对应的用户名是什么的,所以得告诉它确切的uid,root用户一般默认都是1001,特定用户可以用

>> id

查看当前用户的uid
这样在容器内对文件进行的操作都是以该用户的身份进行的,就不会出现升级到root的情况了。

  1. 已经默认root用户启动容器并且修改过文件的所有者了,在容器外又没有权限用chmod修改文件的状态,那么只能再用root身份启动一个容器,在容器内部以root身份修改文件的所有者,修改方式详见https://www.jianshu.com/p/21aca64dad91
    简单修改可以用:
>> chown uid:gid filename

修改到自己账户的uid,在容器外会同步,那么就可以在容器外用自己的账户修改文件了。

总结

docker容器内的环境看似可以随意配置,不会影响系统基础的环境,但实际上还是需要共享内核的,这样随意地就可以得到root权限似乎还是有点可怕,不知道在真正的大服务器上针对这样的问题都是怎么管理的,要是有大神了解还希望能简单讲讲。