今天遇到一个问题,困扰我好久。在docker里面使用go创建文件夹。
err := os.MkdirAll(logDir, 0755)
if err != nil {
glog.Errorf("创建日志文件夹错误:%s", err)
user, err := user.Current()
if err != nil {
log.Fatalf(err.Error())
}
username := user.Username
glog.Infof("当前用户:%s", username)
return
}
总是报错:
非常郁闷,后来查了stackoverflow:
上面有这句话
正如上面说的, os.MkdirAll(xxx,0777)
这里绝大多数情况都是用0777
,因为创建文件夹会触发底层系统调用。系统创建文件夹的时候文件夹的权限等于输入的0777-umask
, 文件夹的umask通常是0022
,也就是0777
创建,创建完成之后都是0755
了。所以这里应该用0777
.
但是改完之后发现还是不行,还是报错。
最终发现给docker启动命令里添加--privileged=true
参数才能解决。
应该是因为docker的映射的目录默认不能创建文件夹,要做这些操作必须设置 --privileged=true
才行。
这个挂载目录,如果进入docker容器,cd到目录会发现连ls
都无权限。
ls: cannot open directory .: Permission denied
可以说是巨坑了。