如何将Docker容器内Python脚本生成的JSON输出保存到本地挂载目录
问题根因
你的Python脚本当前使用相对路径输出output.json,文件会被写入容器内的工作目录/usr/workdir(即Dockerfile里WORKDIR指定的路径)。但你启动容器时仅将本地目录挂载到了容器的/input路径,/usr/workdir没有和本地目录做绑定,加上启动时加了--rm参数,容器退出后会自动删除,存在容器内部非挂载路径的文件会跟着容器一起被清理,本地自然找不到输出文件。
可行方案
方案1:直接输出到已挂载的/input目录
无需修改启动命令,只需要改Python脚本的输出路径为绝对路径,指向已经挂载到本地的/input目录即可:
把原有输出代码
output_file.to_json('output.json' , orient = 'records')
修改为
output_file.to_json('/input/output.json', orient='records')
重新构建镜像后运行,生成的JSON文件会直接出现在本地的/home/huk/Desktop/idea/varskor_annotation/docker_try目录下。
提示:该操作会直接向本地挂载的输入目录写入文件,若目录内有同名output.json会被覆盖,注意提前备份。
方案2:单独挂载输出目录(推荐,文件管理更清晰)
如果不想把输出和输入文件混放在同一个目录,可以单独给输出路径做挂载:
- 修改Python脚本输出路径,指向容器内专门的输出目录:
output_file.to_json('/output/output.json', orient='records') - 在本地新建用于存放输出文件的目录,比如在当前项目路径下新建
output文件夹,修改启动命令,新增输出目录的挂载规则:sudo docker run --rm \ -v /home/huk/Desktop/idea/varskor_annotation/docker_try:/input/ \ -v /home/huk/Desktop/idea/varskor_annotation/docker_try/output:/output/ \ varskor_annotation \ /input/out_total_filtered_2.vcf \ /input/HumanNet_XI_Network_Stats.csv \ /input/exac_gnomad_freq.csv \ /input/gnomad.v2.1.1.lof_metrics.by_transcript.txt
运行完成后,输出文件会存在你本地新建的output目录下。
补充:你原来的启动命令里挂载路径加的单引号属于多余写法,去掉不影响功能,也能避免特殊字符转义导致的挂载异常。
内容的提问来源于stack exchange,提问作者Hamza Umut Karakurt
相关产品推荐
相关产品推荐

