Docker内部无权限创建文件夹的问题

今天遇到一个问题,困扰我好久。在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:

https://stackoverflow.com/questions/58403134/go-permission-denied-when-trying-to-create-a-file-in-a-newly-created-directory

上面有这句话

正如上面说的, 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

可以说是巨坑了。