Docker Run挂载主机共享目录写入文件报Permission denied的原因咨询
问题原因及解决方法
这问题其实是shell重定向的执行上下文搞混了,我给你掰扯清楚:
为什么直接用docker run会报错?
你执行的这条命令:
sudo docker run -it -v ~/shared:/media/ i386/centos:6 echo aaa >> /media/addd.txt
这里的>> /media/addd.txt不是交给容器内部处理的,而是你的宿主机Shell先解析了这个重定向——也就是说,容器里执行echo aaa输出的内容,要写到宿主机的/media/addd.txt里,而宿主机的这个目录通常只有root才有写权限,哪怕你加了sudo,重定向的操作其实没被sudo覆盖,还是普通用户权限在处理,所以就报Permission denied了。
为什么进入容器内部执行就没问题?
当你进入容器内部后,执行echo aaa >> /media/addd.txt时,整个命令都是在容器的Shell环境里运行的:
- 容器里的
/media已经挂载了你宿主机的~/shared目录 - 容器默认是以root用户执行命令的,root对挂载目录有写权限
- 重定向操作是容器内部的Shell处理,直接写到挂载目录对应的宿主机
~/shared/addd.txt,自然没问题。
怎么解决?
要让重定向操作在容器内部完成,你需要把整个命令打包交给容器的Shell来执行,比如用bash -c包裹:
sudo docker run -it -v ~/shared:/media/ i386/centos:6 bash -c "echo aaa >> /media/addd.txt"
这样一来,echo aaa >> /media/addd.txt整个都会在容器内部的bash里执行,重定向也针对容器内的/media(也就是你宿主机的~/shared),权限就没问题了。
内容的提问来源于stack exchange,提问作者vico
相关产品推荐
相关产品推荐

