Docker是否支持「反向COPY」?如何将容器内结果目录同步至主机
解决方案:用绑定挂载实现容器输出直接同步到主机
不需要所谓的「反向COPY」机制,直接通过**绑定挂载(bind mount)**就能让容器内生成的Results目录内容自动同步到主机,完全适配WDL的集成场景,不需要依赖container_id。
具体调整步骤
修改容器运行命令
在docker run时添加第二个挂载参数,将主机的输出目录挂载到容器内脚本生成Results的路径:docker run -v /Path/To/Data:/Data -v /Path/To/Host/Results:/Results --platform linux/amd64 test:Dockerfile注意:原命令末尾的
bash会覆盖Dockerfile里的ENTRYPOINT,导致master.sh不执行,必须去掉。(可选)优化Dockerfile指定工作目录
如果想让路径更清晰,可以在Dockerfile里添加WORKDIR,明确脚本的执行目录:FROM condaforge/mambaforge:22.9.0-1 WORKDIR /workspace COPY master.sh . ENTRYPOINT ["/workspace/master.sh"]对应的
master.sh里的路径保持不变,运行命令的挂载路径调整为:docker run -v /Path/To/Data:/workspace/Data -v /Path/To/Host/Results:/workspace/Results --platform linux/amd64 test:DockerfileWDL集成方式
在WDL任务的runtime块中,通过docker的volumes字段配置挂载,把WDL的输出目录映射到容器内的Results路径:task test_task { input { File data_file String output_dir } command <<< bash /workspace/master.sh >>> runtime { docker { image: "test:Dockerfile" volumes: [ "${data_file}:/workspace/Data/data.txt", "${output_dir}:/workspace/Results" ] platform: "linux/amd64" } } output { File results_file = "${output_dir}/results.txt" } }
原理说明
绑定挂载会直接把主机的目录和容器内的目录做实时同步,容器内写入Results目录的内容会立刻出现在主机对应的挂载目录中,容器退出后内容也会保留在主机上,完全替代了事后docker cp的需求,完美适配WDL这种无法手动获取container_id的自动化工作流场景。
内容的提问来源于stack exchange,提问作者je2018
相关产品推荐
相关产品推荐

