介绍两种从 Docker 容器写入卷时的文件权限处理方式
出品丨Docker公司(ID:docker-cn)
编译丨小东
每周一、三、五,与您不见不散!
容器常常用作原生安装工具的替代品。在主机上使用具有所需版本的容器要比使用过时的工具好的多。但是,只要容器与主机系统进行交互,文件会留下错误或损坏的权限。幸运的是,解决该问题的方法并不需要使用脚本。
问题描述
当容器挂载一个本地目录并将文件写入其中时,其所有权由容器内的用户决定:
nicholas@host:~/source$ mkdir source nicholas@host:~/source$ docker run -it --rm --volume $(pwd):/source --workdir /source ubuntu root@a031d11c9515:/source# mkdir subdir root@a031d11c9515:/source# touch subdir/newfile root@a031d11c9515:/source# exit exit nicholas@host:~/source$ ls -lR .: total 4 drwxr-xr-x 2 root root 4096 Jul 16 19:35 subdir ./subdir: total 0 -rw-r--r-- 1 root root 0 Jul 16 19:35 newfile nicholas@host:~/source$ rm -rf subdir/ rm: cannot remove 'subdir/newfile': Permission denied
另外,您还可能无法删除这些目录和拥有错误所有权的文件。
解决方案1:从容器中删除
一个非常常见的解决方案是从容器内部更改文件和目录的所有权:
nicholas@host:~/source$ docker run -it --rm --volume $(pwd):/source --workdir /source ubuntu root@d1c3bee8bb2b:/source# ls -al total 12 drwxrwxr-x 3 1000 1004 4096 Jul 16 19:35 . drwxr-xr-x 1 root root 4096 Jul 16 19:39 .. drwxr-xr-x 2 root root 4096 Jul 16 19:35 subdir root@d1c3bee8bb2b:/source# chown 1000:1000 subdir/ -R root@d1c3bee8bb2b:/source# ls -l total 4 drwxr-xr-x 2 1000 1000 4096 Jul 16 19:35 subdir root@d1c3bee8bb2b:/source# exit exit nicholas@host:~/source$ ls -l total 4 drwxr-xr-x 2 nicholas lpadmin 4096 Jul 16 19:35 subdir nicholas@host:~/source$
这种方法的缺点是需要添加额外的逻辑,以及您需要知道运行该容器用户的用户 ID 和组 ID。
解决方案2:创建拥有正确所有权的文件
第二种解决方案更简洁,它将使用容器内的正确所有权创建文件和目录。Docker 提供了一个参数来设置容器内用户的用户 ID 和组 ID:
nicholas@host:~/source$ docker run -it --rm --volume $(pwd):/source --workdir /source --user $(id -u):$(id -g) ubuntu groups: cannot find name for group ID 1004 I have no name!@bf7f355f3b65:/source$ touch newfile I have no name!@bf7f355f3b65:/source$ exit exit nicholas@host:~/source$ ls -l total 4 -rw-r--r-- 1 nicholas nicholas 0 Jul 16 19:42 newfile drwxr-xr-x 2 nicholas lpadmin 4096 Jul 16 19:35 subdir nicholas@host:~/source$
这种方法可以很好的帮您解决用户 ID 和组 ID 的错误。
请注意,出于安全目的,在容器内以 root 身份运行是最糟糕的做法。Dockerfile 应始终使用 USER 指令从而避免直接使用 root 权限。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Kubernetes弹性伸缩全场景解析(三) - HPA实践手册
前言 在上一篇文章中,给大家介绍和剖析了HPA的实现原理以及演进的思路与历程。在本文中,我们会为大家讲解如何使用HPA以及一些需要注意的细节。 autoscaling/v1实践 v1的模板可能是大家平时见到最多的也是最简单的,v1版本的HPA只支持一种指标 —— CPU。传统意义上,弹性伸缩最少也会支持CPU与Memory两种指标,为什么在Kubernetes中只放开了CPU呢?其实最早的HPA是计划同时支持这两种指标的,但是实际的开发测试中发现,内存不是一个非常好的弹性伸缩判断条件。因为和CPU不同,很多内存型的应用,并不会因为HPA弹出新的容器而带来内存的快速回收,因为很多应用的内存都要交给语言层面的VM进行管理,也就是内存的回收是由VM的GC来决定的。这就有可能因为GC时间的差异导致HPA在不恰当的时间点震荡,因此在v1的版本中,
- 下一篇
Automated operation of Function Compute
Prefaces A decade ago, cloud servers abstracted away physical servers paving the way for more technological advancements. Serverless computing is a cloud-computing execution model in which the cloud provider acts as the server, dynamically managing the allocation of machine resources. Serverless Computing abstracts the underlying servers and is considered as a form of
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7安装Docker,走上虚拟化容器引擎之路