问题描述
将Docker的docker-compose.yml文件环境变量和依赖文件放在 home 文件夹下, 通过docker portainer部署堆栈, 启动报错权限不足, 修改权限后仍然报错文件无法找到
原因分析
Ubuntu 服务器上启用的额外安全模块,最常见的就是 AppArmor。
-
错误信息:
no such file or directory(没有那个文件或目录)。 -
事实: 通过
ls命令确认文件是存在的。 -
推论: 当系统报告“不存在”一个“存在”的文件时,这几乎总是一个权限掩蔽 (Permission Masking) 错误。
-
罪魁祸首: Docker 守护进程 (Daemon) 在尝试代表 Portainer 读取在 YML 文件中指定的宿主机绝对路径时,遭到了 AppArmor(Ubuntu 默认的强制访问控制系统)的阻止。
-
为什么在
/home/pixel目录会失败? AppArmor(以及 SELinux)的默认策略非常严格,它们专门限制服务(如 Docker Daemon)随意读取用户的主目录 (/home/)。即使您设置了755权限,AppArmor 的安全策略也会优先执行,并阻止该访问。
解决方法
将堆栈文件移出 /home 目录
解决这个问题的最简单方法是,不要将 Docker 堆栈配置文件(.env 等)放在受严格保护的用户主目录中。将它们移动到更“中立”的位置,例如 /opt 或 /srv。
这里选择/opt
sudo mkdir -p /opt/docker-stacks