如何在Docker中挂载JSON文件并作为C#程序的数据源?
解决Docker挂载data.json并让C#程序正确读取的问题
1. 修正C#程序的文件路径
容器内默认是Linux环境,程序的工作目录(通常为/app)与本地项目工作目录不同,使用相对路径var/data/data.json会导致程序读取镜像中打包的文件,而非挂载的外部文件。必须改用绝对路径指向挂载目标:
var filePath = @"/var/data/data.json"; var json = JsonDocument.Parse(File.ReadAllText(filePath)); var deserialized = json.Deserialize<List<Member>>();
2. 修正Docker Compose的挂载配置
当前配置存在两处问题:Bind mount的source路径错误、混淆了bind mount与named volume的用法,修正如下:
方案一:挂载目录(推荐)
确保主机路径基于docker-compose.yml所在位置,修正后的配置:
version: '2' networks: default: ipam: driver: default services: myapp: image: myapp-image:latest ports: - '7113:8080' networks: - default volumes: - type: bind source: ./var/data/ # 主机上data.json所在目录(相对docker-compose.yml的路径) target: /var/data/ # 容器内目标目录
方案二:直接挂载单个文件(更精确)
若只需挂载data.json而非整个目录:
version: '2' networks: default: ipam: driver: default services: myapp: image: myapp-image:latest ports: - '7113:8080' networks: - default volumes: - type: bind source: ./var/data/data.json # 主机上data.json的精确路径 target: /var/data/data.json # 容器内文件的精确路径
3. 验证挂载有效性
启动容器后,执行以下命令检查容器内文件是否存在:
docker exec -it <容器ID/名称> ls /var/data/
若未找到data.json,排查以下点:
- 确认Windows Docker Desktop已开启文件共享(Settings > Resources > File Sharing);
- 主机路径使用正斜杠
/,避免Windows反斜杠\的转义问题; - 若使用绝对路径,确保路径准确(如
C:/projects/myapp/var/data/)。
4. 检查镜像构建逻辑
若Dockerfile中包含COPY var/data/data.json /var/data/命令,会将本地文件打包进镜像。挂载操作会覆盖镜像中的对应文件,只要程序路径指向挂载位置即可,无需删除该命令(若需要默认数据源)。
内容的提问来源于stack exchange,提问作者codingjoe
相关产品推荐
相关产品推荐

