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 设置,如下:
TVB老戏骨夏玉麟去世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 权限。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。如有错误或未考虑完全的地⽅,望不吝赐教。
>密码忘了怎么办

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。