时间:2021-05-19
在应用docker容器的时候,更多的时候我们会把宿主机的目录挂载到docker容器中。
在宿主机的文件夹权限隶属于root时,我们需要将文件夹的权限用户进行 chown 设置,才能保证目录的内容的正常写入,
使用的是docker版本的jenkins,运行后,出现如下错误:
[root@localhost CICD]# docker logs -f jenkins touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission deniedCan 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 sourcenicholas@host:~/source$ docker run -it --rm --volume $(pwd):/source --workdir /source ubunturoot@a031d11c9515:/source# mkdir subdirroot@a031d11c9515:/source# touch subdir/newfileroot@a031d11c9515:/source# exitexitnicholas@host:~/source$ ls -lR.:total 4drwxr-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 newfilenicholas@host:~/source$ rm -rf subdir/rm: cannot remove 'subdir/newfile': Permission denied另外,您还可能无法删除这些目录和拥有错误所有权的文件。
一个非常常见的解决方案是从容器内部更改文件和目录的所有权:
nicholas@host:~/source$ docker run -it --rm --volume $(pwd):/source --workdir /source ubunturoot@d1c3bee8bb2b:/source# ls -altotal 12drwxrwxr-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 subdirroot@d1c3bee8bb2b:/source# chown 1000:1000 subdir/ -Rroot@d1c3bee8bb2b:/source# ls -ltotal 4drwxr-xr-x 2 1000 1000 4096 Jul 16 19:35 subdirroot@d1c3bee8bb2b:/source# exitexitnicholas@host:~/source$ ls -ltotal 4drwxr-xr-x 2 nicholas lpadmin 4096 Jul 16 19:35 subdirnicholas@host:~/source$这种方法的缺点是需要添加额外的逻辑,以及您需要知道运行该容器用户的用户 ID 和组 ID。
第二种解决方案更简洁,它将使用容器内的正确所有权创建文件和目录。Docker 提供了一个参数来设置容器内用户的用户 ID 和组 ID:
nicholas@host:~/source$ docker run -it --rm --volume $(pwd):/source --workdir /source --user $(id -u):$(id -g) ubuntugroups: cannot find name for group ID 1004I have no name!@bf7f355f3b65:/source$ touch newfileI have no name!@bf7f355f3b65:/source$ exitexitnicholas@host:~/source$ ls -ltotal 4-rw-r--r-- 1 nicholas nicholas 0 Jul 16 19:42 newfiledrwxr-xr-x 2 nicholas lpadmin 4096 Jul 16 19:35 subdirnicholas@host:~/source$这种方法可以很好的帮您解决用户 ID 和组 ID 的错误。
请注意,出于安全目的,在容器内以 root 身份运行是最糟糕的做法。Dockerfile 应始终使用 USER 指令从而避免直接使用 root 权限。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Docker容器内不能联网的6种解决方案注:下面的方法是在容器内能ping通公网IP的解决方案,如果连公网IP都ping不通,那主机可能也上不了网(尝试ping
上篇文章在docker容器挂载宿主主机目录中介绍了运行docker时的一个重要命令-vsudodockerrun-p8822:8080--nametomcat_
一、dockerps列出容器二、dockercp拷贝文件至容器注:docker中宿主机与容器(container)互相拷贝传递文件的方法1、从容器拷贝文件到宿主
背景:有一个flask项目提供接口,使用docker容器构建并且运行,MySQL在宿主机运行,需要在容器中可以让flask连接上宿主机的mysql使用ifcon
一直以为docker是没有ip地址的,其实docker的网络模板有点类似我们平常使用虚拟机的host-only模式,容器和宿主机组成一个独立的局域网,宿主机的i