docker主机路径与容器路径(Docker容器没有权限写入宿主机目录的解决方案)
类别:服务器 浏览量:1781
时间:2021-10-18 11:13:05 docker主机路径与容器路径
Docker容器没有权限写入宿主机目录的解决方案在应用docker容器的时候,更多的时候我们会把宿主机的目录挂载到docker容器中。
在宿主机的文件夹权限隶属于root时,我们需要将文件夹的权限用户进行 chown 设置,才能保证目录的内容的正常写入,
下面是一个例子:使用的是docker版本的jenkins,运行后,出现如下错误:
[root@localhost CICD]# docker logs -f jenkins touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
我jenkins挂载的目录是 /opt/jenkins/xxxxx,root 用户创建,而 jenkins user的uid为1000
所以需要进行 chown 设置,如下:
sudo chown -R 1000:1000 /opt/jenkins
然后重启容器,错误就没有了。
补充:介绍两种从 Docker 容器写入卷时的文件权限处理方式
说在前面容器常常用作原生安装工具的替代品。在主机上使用具有所需版本的容器要比使用过时的工具好的多。但是,只要容器与主机系统进行交互,文件会留下错误或损坏的权限。
幸运的是,解决该问题的方法并不需要使用脚本。
问题描述当容器挂载一个本地目录并将文件写入其中时,其所有权由容器内的用户决定:
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 权限。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持开心学习网。如有错误或未考虑完全的地方,望不吝赐教。
您可能感兴趣
- docker启动sqlserver(用docker运行postgreSQL的方法步骤)
- docker管理工具选择(Docker可视化管理工具DockerUI的使用)
- docker配置https访问方式(docker 中配置 eureka的方法)
- docker入门搭建博客(快速掌握使用Docker搭建开发环境)
- docker容器映射到宿主机器(在宿主机上执行docker容器内部的shell或程序方式)
- rabbitmq docker配置(Docker部署Rabbitmq容器实现过程解析)
- centos中docker安装部署(三分钟完成 ubuntu16.04初始化,Java,maven,docker环境的部署问题)
- 用docker搭建redis集群(docker实现redis集群搭建的方法步骤)
- java连接mongodb(Docker连接mongodb实现过程及代码案例)
- dockerregistry原理(解决Docker x509 insecure registry的问题)
- 2022-01-25 00:54:18
- docker 命令上传镜像到镜像仓库(Docker 制作镜像Dockerfile和commit操作)
- 基于docker的平台搭建(基于docker搭建selenium分布式环境)
- docker怎么搭建私有服务器(docker搭建CMS点播系统带播放器功能)
- docker部署php本地开发环境(CentOS7环境下使用Docker搭建PHP运行环境的过程详解)
- ubuntu下使用vscode(使用Vscode结合docker进行开发的详细过程)
- 谷雨前,吃牛羊肉别忘了吃河鲜,除湿还清热,加紫苏一炒特解馋(吃牛羊肉别忘了吃河鲜)
- 紫苏牛肉锅里滚一滚,香的鼻子都要掉了(紫苏牛肉锅里滚一滚)
- 每天都吃水果的好处(每天吃水果的好处与功效)
- 苹果15价格(苹果15价格512g官网)
- 春节放假几天(春节放假几天2023法定几天)
- 今天 3月13日,31年前,一个英雄少年感动了中国(今天3月13日31年前)
热门推荐
- linux nginx搭建(Ubuntu使用nginx搭建webdav文件服务器的详细过程)
- vueelementui左侧菜单(Vue Element前端应用开发之动态菜单和路由的关联处理)
- $(document).ready和window.onload的区别
- mysql数据库下载安装步骤(MySQL数据库压缩版本安装与配置详细教程)
- dedecms 自定义字段(dedecms自定义模型提示:Call to a member function GetInnerText的解决方法)
- laravel 快速开发api技巧(Laravel5.4简单实现app接口Api Token认证方法)
- 云服务器性能怎么判断(怎么判断云服务器适合自己的企业呢?)
- yii框架使用教程(Yii框架连表查询操作示例)
- javascript如何转换int型(浅谈JavaScript中的parseInt的妙用)
- linux中符号的基础用法总结(Linux tr命令的使用)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9