为什么Docker容器运行.NET应用时无法找到待创建文件的路径?
问题解答
核心问题原因
- docker-compose.yml的配置仅对通过
docker compose系列命令(如docker compose up、docker compose run)启动的容器生效,你直接使用docker run命令启动容器时,程序完全不会读取docker-compose.yml中的配置,因此文件里定义的卷挂载规则没有生效。 - 你的报错本质是容器内不存在
/output_json目录:System.IO.File.WriteAllText不会自动创建不存在的上级目录,当目标路径的父目录不存在时就会抛出你遇到的路径不存在错误。
关于你之前的判断说明
你的判断部分正确:
- 不需要给容器额外分配独立存储空间,Docker默认的临时文件系统本身支持写入,前提是写入路径对应的目录存在。
- 如果你需要把生成的文件持久化保存在宿主机、避免容器销毁后文件丢失,确实需要通过卷挂载把宿主机目录共享到容器内。
关于docker-compose卷挂载的说明
你在docker-compose.yml中看到的- ./output:/output_json规则,在使用docker-compose启动容器时,会自动完成两个操作:
- 自动在容器内创建
/output_json目录 - 把宿主机当前执行命令目录下的
output文件夹(如果不存在也会自动创建)挂载到容器的/output_json路径,两边的内容会实时同步。
解决方法
你可以二选一:
- 使用docker-compose启动容器:直接在docker-compose.yml所在目录执行
docker compose up -d即可,所有配置会自动加载,不需要额外加参数。 - 给docker run加上卷挂载参数:启动时补充
-v参数,Windows PowerShell环境下的示例命令如下:
docker run -e 你的环境变量名=值 -p 宿主机端口:容器端口 -v ${PWD}/output:/output_json 你的镜像名
如果不想挂载宿主机目录、仅需要临时写入容器内部,也可以在原Dockerfile中添加一行RUN mkdir -p /output_json重新构建镜像,即可保证容器内默认存在该目录。
内容的提问来源于stack exchange,提问作者JAF
相关产品推荐
相关产品推荐

