同一个镜像本地跑正常,上了 compose 挂载 ./conf:/app/config 后启动报 FileNotFoundException: /app/config/application.yml。宿主机那个目录是空的。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,bind mount 把宿主机目录整个盖在容器路径上,镜像里原有的文件不会合并进来。宿主机目录为空时,容器看到的就是一个空目录,应用自然找不到配置。

碰到「volume 覆盖镜像目录」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

docker run --rm -v $PWD/conf:/app/config api:1.4 ls -l /app/config
docker inspect api --format '{{json .Mounts}}'

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

具体做法是,先用 docker run 不带挂载跑一次 确认镜像里确实有这个文件;需要保留镜像内文件就改成挂单个文件 或者先把默认配置拷到宿主机目录;用命名卷代替 bind mount 首次启动时会把镜像内容复制进去;挂完进容器 ls 一遍目标目录 确认文件数量。

最后用这个标准收尾,容器里 ls 能看到 application.yml,启动不再报文件不存在。

作者 9823189