Docker部署PostgreSQL时‘Operation not permitted’错误原因排查
1. MacOS文件系统权限与隔离限制
MacOS的隐私保护机制(即使给终端开了全磁盘访问,Docker容器进程的权限仍受Docker Desktop文件共享配置约束),加上系统对部分目录的默认保护,会导致容器无法读取挂载的本地脚本。如果脚本所在目录未添加到Docker Desktop的文件共享列表,容器直接没有访问权限,就会抛出"Operation not permitted"。
2. 本地脚本路径错误
执行chmod时提示文件不存在,说明你指定的路径要么拼写有误,要么终端执行命令时的工作目录和脚本实际所在目录不匹配。比如你在Compose里写的是相对路径./docker-database-initial.sql,但启动Compose时的工作目录并不是脚本所在目录,导致挂载的是一个不存在的文件,容器内自然无法读取。
3. Docker Compose挂载语法错误
如果挂载配置写错,比如把本地路径和容器路径搞反,或者本地路径指向的是目录而非文件,会导致容器内/docker-entrypoint-initdb.d/下的脚本异常。正确的挂载写法示例:
volumes: - ./docker-database-initial.sql:/docker-entrypoint-initdb.d/docker-database-initial.sql
若本地路径写错成目录,容器内对应的位置会变成空目录,而非脚本文件,进而触发权限或执行错误。
4. MacOS文件扩展属性限制
如果脚本是从网络下载的,MacOS会自动添加com.apple.quarantine扩展属性标记,即使修改文件权限,这个属性也会阻止容器访问文件。可以用以下命令排查并解决:
# 查看文件扩展属性 xattr -l docker-database-initial.sql # 删除隔离属性 xattr -d com.apple.quarantine docker-database-initial.sql
5. Docker Desktop文件共享未配置
Docker Desktop在MacOS下需要手动开启目标目录的文件共享权限。打开Docker Desktop的Settings -> Resources -> File Sharing,检查脚本所在的父目录是否在共享列表中,若未添加则手动加入,之后重启Docker Desktop生效。
内容的提问来源于stack exchange,提问作者Kaio H. Cunha

