VS Code Dev Container docker compose挂载文件被误识别为目录
问题原因
使用「在容器卷中克隆仓库」功能时,VS Code 会先把仓库内容拉取到专属Docker命名卷内,不会直接挂载本地磁盘的仓库目录。
docker-compose 启动mongodb-setup这类附属容器时,解析volume配置的时机早于VS Code把仓库文件同步到工作区卷的步骤。此时你配置的./scripts相对路径在docker-compose的执行上下文里不存在真实文件,Docker会默认把不存在的挂载源创建为空目录,最终导致mongosetup.sh被识别成文件夹。
如果是先把仓库克隆到本地再打开Dev Container,本地路径下真实存在脚本文件,Docker不会触发自动创建目录的逻辑,所以运行正常。之前尝试直接挂载单个文件、修改volume路径写法都没解决问题,本质是因为这些配置解析时目标文件还没出现在对应路径,和挂载语法本身无关。
解决方法
优先选最简单的第一种方案:
- 直接使用工作区内的脚本路径,删掉单独的scripts目录挂载配置
你已经确认容器内可以正常访问/workspaces/REPONAME路径下的文件,直接把初始化命令指向该路径下的脚本即可,不需要额外做目录挂载:
把路径里的仓库名替换成你mongodb-setup: image: mongo command: ["bash", "/workspaces/替换成你的实际仓库名/.devcontainer/scripts/mongosetup.sh"] depends_on: - mongodb/workspaces下实际的目录名称就行,不需要再配置./scripts:/scripts的volume规则。 - 备选方案:改用Dev Container生命周期钩子执行初始化
可以把Mongo副本集初始化的逻辑挪到devcontainer.json的postStartCommand配置里执行,这类钩子会在VS Code完成工作区卷挂载、所有文件同步完成后才运行,完全不会出现路径不存在的问题,也不需要额外维护一个初始化容器。 - 不推荐的方案:如果一定要保留独立挂载scripts目录的配置,需要在devcontainer.json里额外配置工作区卷的挂载传播规则,强制附属容器等待工作区卷挂载完成后再启动,配置复杂度较高,没有特殊需求不建议用。
内容的提问来源于stack exchange,提问作者Joe Jankowiak
相关产品推荐
相关产品推荐

