Docker 挂载报 mount path must be absolute
Linux 容器的挂载目标必须是绝对路径。区分宿主 source 与容器 target,通过 Compose 长语法核对最终配置,避免 working_dir 和宿主路径掩盖错误。
Compose 中写了 ./data:opt/app/data,容器还没启动就报:
invalid mount path: 'opt/app/data' mount path must be absolute
对于 Linux 容器,这里的错误指向挂载的容器内目标路径。opt/app/data 缺少开头的 /;把宿主目录改成绝对路径,或给镜像增加 WORKDIR /,都没有修正这个目标。
下面针对当前 Docker Engine 与 Docker Compose 的 Linux bind mount。Windows 容器有自己的路径形式,不能把这里的 /opt/app/data 规则机械套到它上面。
先把 source 和 target 分开看
短语法 ./data:/opt/app/data:ro 包含宿主来源、容器目标和访问模式。前面的 ./data 与后面的 /opt/app/data 属于不同文件系统。
在本地部署中,Compose 可以解析相对的宿主来源路径;容器内的挂载目标仍必须是绝对路径。working_dir 控制进程工作目录,不会把相对挂载目标自动补成工作目录下的路径。
错误清单可能写成:
volumes:
- ./data:opt/app/data
若预期目标确实是容器根目录下的 opt/app/data,应改为:
volumes:
- ./data:/opt/app/data:ro
这里使用只读挂载说明读取场景;应用需要写入时,应按实际数据用途决定读写权限。不要因为遇到路径校验错误,就放宽宿主目录权限。
长语法可以避免看错冒号两侧
下面是一份完整的演示 compose.yaml,假设旁边已存在 data 目录。使用当前 Compose、本地 Linux 容器环境,示例容器只列出挂载内容后退出:
services:
inspect-data:
image: alpine:3.22
command: ["ls", "-la", "/opt/app/data"]
volumes:
- type: bind
source: ./data
target: /opt/app/data
read_only: true
bind:
create_host_path: false
source 保留宿主路径,target 明确容器路径。create_host_path: false 使来源不存在时失败,避免拼错来源后自动建立空目录,进而误以为挂载成功但数据丢失。
这份示例用于独立测试目录。实际服务应只修改对应挂载,保留镜像、启动命令、用户、其他卷和配置,不要用整个演示文件替换应用部署。
检查最终配置和真实挂载
先使用实际部署所用的相同 Compose 文件组合查看解析结果:
docker compose config
如果部署原本使用多个 -f、环境文件或项目目录参数,检查时也要保留。核对目标服务的最终 volumes,尤其是覆盖文件是否又把目标改成相对路径。输出可能包含展开后的敏感配置,不应直接公开。
在隔离目录启动演示服务,可以查看目录列表与退出状态:
docker compose up inspect-data
docker compose ps -a
针对实际创建的容器,还可以读取挂载记录。把示例名称替换成具体容器名称或 ID:
docker inspect example-container --format '{{json .Mounts}}'
确认 Source 指向正确宿主位置、Destination 是所需的绝对容器路径,以及 RW 符合预期。容器创建失败时可能没有可供 inspect 的对象,此时应继续核对错误与渲染结果,而不是把对象不存在看成另一个挂载根因。
改路径前确认数据用途
挂载会遮住镜像在目标路径原有的内容。错误地把目标改成 / 或整个应用目录,可能让启动文件不可见;正确修复应使用应用实际读取的目录,而不是随便加一个能通过校验的路径。
已经运行的容器不会因 YAML 被编辑就自动改变挂载。应用正式变更时按既有部署流程重建受影响服务,提前保存配置和需要保留的数据,避免随手执行带删卷选项的清理命令。
若修改后挂载到了错误目录,停止进一步写入,按变更前记录恢复挂载配置,并检查错误目标期间产生的数据。只恢复 YAML 不会自动合并写到别处的文件。修复完成的标准是实际挂载位置、内容和应用行为均正确,而不仅是绝对路径校验通过。


