Docker容器没有权限写入宿主机目录的解决方案

 更新时间:2021年03月24日 14:35:57   作者:catoop  
这篇文章主要介绍了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中容器的网络配置常用命令详解

    docker中容器的网络配置常用命令详解

    这篇文章主要介绍了docker中容器的网络配置常用命令详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • docker搭建CMS点播系统带播放器功能

    docker搭建CMS点播系统带播放器功能

    熟悉docker的童鞋都知道,安装是非常的便利的,也可以在线体验的,今天通过本文给大家介绍docker搭建CMS点播系统带播放器功能,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • 解决Docker容器没有vim命令的方法

    解决Docker容器没有vim命令的方法

    这篇文章主要给大家介绍了关于解决Docker容器没有vim命令的方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Docker容器具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • docker pure-ftp 搭建ftp服务器的方法

    docker pure-ftp 搭建ftp服务器的方法

    本篇文章主要介绍了docker pure-ftp 搭建ftp服务器的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 基于Docker快速搭建ELK的方法

    基于Docker快速搭建ELK的方法

    这篇文章主要介绍了基于Docker快速搭建ELK的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • docker-compose中启动镜像失败的几种解决方法

    docker-compose中启动镜像失败的几种解决方法

    本文主要介绍了docker-compose中启动镜像失败的几种解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • docker run 运行容器自动结束的解决

    docker run 运行容器自动结束的解决

    这篇文章主要介绍了docker run 运行容器自动结束的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 教你如何在windows 10家庭版上安装docker

    教你如何在windows 10家庭版上安装docker

    这篇文章主要介绍了如何在windows 10家庭版上安装docker的步骤,本文分为五步通过图文给大家介绍的非常详细,需要的朋友可以参考下
    2021-12-12
  • centos下docker安装及springboot远程发布docker的方法

    centos下docker安装及springboot远程发布docker的方法

    这篇文章主要介绍了centos下docker安装及springboot远程发布docker的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 手动构建自己的docker容器镜像实战

    手动构建自己的docker容器镜像实战

    这篇文章主要介绍了如何手动构建自己的镜像并上传到镜像仓库中,文中有详细的代码实例,需要的朋友可以参考阅读
    2023-04-04

最新评论