命令行挂载卷运行dbt容器 宿主机挂载目录为空问题排查
问题原因
- 你的挂载参数写法存在语法错误:
-v /home/mypath/app:/usr/app,rshared:rshared中重复写rshared加冒号的格式是无效的。Docker的-v挂载参数格式固定为宿主机路径:容器内路径:挂载选项,多个选项用逗号分隔即可,不需要重复加冒号传参。 - PostgreSQL容器同格式挂载能正常运行,是PostgreSQL镜像的启动脚本做了特殊兼容:启动时会检测挂载的数据目录是否为空,如果是空目录就自动把内置的初始数据库文件复制到挂载目录后再启动服务,这是镜像自身的逻辑,不是Docker绑定挂载的默认行为。
- Docker绑定挂载的默认逻辑是:当你指定的宿主机目录存在(哪怕是空目录),挂载后会直接用宿主机目录的内容覆盖容器内对应路径的内容,不会主动把容器内原有文件同步到空的宿主机目录。你之前能在容器内看到
/usr/app下的完整文件,本质是因为挂载参数写错导致挂载未生效,容器直接使用镜像内置的文件系统,宿主机目录自然是空的。
操作步骤
- 先删除之前创建的异常容器
docker rm -f dbt
- 提前把镜像内
/usr/app路径下的所有文件复制到宿主机目标目录,不要直接挂载空目录
docker run --rm -v /home/mypath/app:/target xemuliam/dbt:latest cp -r /usr/app/. /target/
命令执行完成后,你可以直接在宿主机/home/mypath/app路径下看到所有dbt项目文件,如果文件权限导致无法编辑,执行chown调整为当前用户权限即可。
3. 用正确的参数启动正式容器,普通本地调试场景不需要额外加rshared这类挂载传播参数,使用默认配置即可:
docker run -d --name dbt \ -p 8085:8085 \ -v /home/mypath/app:/usr/app \ xemuliam/dbt:latest
启动完成后,宿主机和容器内的/usr/app目录会实时双向同步,直接在宿主机编辑代码、修改配置,容器内可以即时生效,满足本地调试需求。
如果你确实有嵌套挂载的特殊需求需要配置
rshared传播模式,正确写法是把参数放在挂载选项位,即-v /home/mypath/app:/usr/app:rshared,不要重复传参。
内容的提问来源于stack exchange,提问作者avnav99
相关产品推荐
相关产品推荐

