执行 docker run 时出现 invalid mount config for type "bind",说明Docker在创建容器前拒绝了绑定挂载配置。常见原因是宿主机源路径不存在、目标路径不是绝对路径,或Docker客户端连接到远程daemon后检查了另一台主机的文件系统。
绑定挂载的源路径属于Docker daemon所在主机,不一定是你敲命令的客户端。 先确认上下文和两端路径,再决定是否创建目录。

先读完整错误并确认Docker上下文
保留完整命令和错误文本,然后检查当前上下文与daemon端点:
docker context show
docker context inspect --format '{{json .Endpoints.docker.Host}}'
printf 'DOCKER_HOST=%s\n' "${DOCKER_HOST:-<unset>}"
如果使用SSH context、远程TCP或Docker Desktop,/srv/app 必须存在于daemon能够访问的环境中,而不是本地终端所在的文件系统。Docker官方也指出,bind mount创建在daemon主机上,远程客户端无法直接把自己的本地目录绑定到远端容器。
先确认daemon位置,是避免所谓本地明明存在、Docker却说不存在的关键判断。
检查源路径是否真实存在
对于下面的长语法:
docker run --rm \
--mount type=bind,src=/srv/example/config,dst=/app/config,readonly \
alpine:latest ls -la /app/config
--mount 默认要求 src 已经存在。先在daemon主机检查类型、软链接和逐级权限:
stat /srv/example/config
readlink -f /srv/example/config
namei -l /srv/example/config
Docker官方文档明确说明,--mount 遇到缺失源路径会返回 bind source path does not exist;而 -v 会自动创建缺失源路径,并且创建成目录。不要为了消除报错随意改用 -v,否则文件路径拼错也可能被静默创建成目录。
核对目标路径和挂载语法
容器内的 dst 或 target 必须是绝对路径。推荐使用字段清楚的长语法:
docker run --rm \
--mount type=bind,source=/srv/example/data,target=/var/lib/example \
example-image:latest
短语法使用 宿主机路径:容器路径:选项:
docker run --rm \
-v /srv/example/data:/var/lib/example:ro \
example-image:latest
包含空格的Shell变量必须整体引用,空变量更要提前拒绝:
test -n "${HOST_DATA_DIR:-}" || { echo 'HOST_DATA_DIR is empty' >&2; exit 1; }
docker run --rm --mount "type=bind,src=$HOST_DATA_DIR,dst=/data" alpine:latest ls /data
不要把空变量展开成根目录或意外路径。 在自动化中应先用 test -d 或 test -f 验证预期类型。
处理只读、安全标签和被遮蔽目录
bind mount默认可写,容器进程可能修改宿主机文件。配置文件和静态资源应按需要使用 readonly 或 ro:
docker run --rm \
--mount type=bind,src=/srv/example/config,dst=/app/config,readonly \
example-image:latest
在启用SELinux的发行版上,标签不匹配会表现为容器启动后访问被拒绝,这与创建阶段的invalid mount config不同。应按平台支持的挂载标签方式处理,不能全局关闭SELinux。还要注意,挂载到镜像中已有内容的目录会遮蔽原内容。
可以在 萤光云 的隔离节点验证Linux bind mount;需要测试远程context时,也可在 LightNode 建立临时daemon。测试路径不要指向生产数据库目录。
用inspect完成结果验收
创建容器后读取Docker实际记录的挂载信息:
docker inspect example-container \
--format '{{range .Mounts}}{{println .Type .Source "->" .Destination .RW}}{{end}}'
然后在容器内验证目标存在和读写边界:
docker exec example-container sh -c 'ls -ld /var/lib/example && test -r /var/lib/example'
如果配置为只读,可在测试容器中验证写入被拒绝;不要在生产数据目录创建无意义的探针文件。
验收标准是容器成功创建、Source指向预期daemon主机路径、Destination正确、读写属性符合设计,并且没有因自动创建目录或挂载遮蔽而读取错误数据。
FAQ
为什么本地目录存在,远程Docker仍提示不存在?
因为bind mount由daemon创建。使用远程context时,源路径必须存在于远端daemon主机。
--mount 和 -v 哪个更安全?
两者都能创建bind mount,但 --mount 字段更清楚,而且源路径缺失时直接失败,更适合要求严格的生产脚本。
可以绑定单个文件吗?
可以,但源文件必须存在且类型正确。若使用 -v 指向不存在的文件路径,Docker可能先创建目录,随后让应用因类型不符而失败。
温馨提示
路径错误最怕被自动创建掩盖。生产脚本应先验证源路径、确认daemon位置,并显式声明只读边界;不要把改用短语法当作通用修复。


