我是docker和container的新手。我有一个包含MRI分析软件的容器。在该容器中,还有许多其他软件,主软件从中提取命令。我想使用位于外部硬盘驱动器上的研究数据从该容器中的一种软件运行一个命令,该数据插入到运行docker的本地计算机中。
我知道有一个cp
命令可用于将文件(例如脚本)复制到容器中,而沿这些方面的大多数其他问题似乎建议将文件从本地计算机复制到容器中,然后运行脚本(或其他任何内容)。就我而言,我需要容器来访问目录结构中单独文件夹中的数据,并且由于整个目录很大,因此无法在整个目录中进行复制。
老实说,我只是想知道如何使用本地计算机上存在的输入在docker内部运行单个命令。我已经运行docker ps
来获得CONTAINER_ID
,它是d8dbcf705ee7。研究了在容器内执行命令之后,我尝试了以下命令:
docker exec d8dbcf705ee7 /bin/bash -c "mcflirt -in /Volumes/DISS/FMRIPREP/sub-S06V1A/func/sub-S06V1A_task-compound_run-01_bold.nii -out sub-S06V1A_task-compound_run-01_bold_mcf_COMMAND_TEST.nii.gz -reffile /Volumes/DISS/FMRIPREP_TMP/sub-S06V1A_dof6_ver1.2.5/fmriprep_wf/single_subject_S06V1A_wf/func_preproc_task_compound_run_01_wf/bold_reference_wf/gen_ref/ref_image.nii.gz -mats -plots"
mcflirt
是我要在容器内运行的命令。我相信exec
命令会执行我希望的操作,因为如果运行docker exec d8dbcf705ee7 /bin/bash -c "mcflirt"
,我将获得mcflirt
命令的帮助输出,在这种情况下,这是预期的结果。 /Volume/...
路径内的文件是我要访问的本地计算机上的文件。我知道文件的位置是问题所在,因为我无法在此命令中使用Tab键完成路径。运行此命令时,将得到以下输出:
Image Exception : #22 :: ERROR: Could not open image /Volumes/DISS/FMRIPREP/sub-S06V1A/func/sub-S06V1A_task-compound_run-01_bold
terminate called after throwing an instance of 'RBD_COMMON::BaseException'
有人能指出我正确的方向吗?
答案 0 :(得分:2)
因此,如果我说对了,则需要执行一些shell
脚本并提供上下文(例如本地文件)。
方法很简单。
可以说您的脚本和所有需要的文件位于您的主机 PC的/hello
文件夹中(无论它们是否存储在一起,仅显示其技巧)。 / p>
/hello
- runme.sh
- datafile1
- datafile1
您将此文件夹安装到容器中,以使文件在内部可访问。如果您不要需要容器来修改它们,则最好以readonly
模式挂载。
您可以这样启动docker:
docker run -it -v /hello:/hello2:ro ubuntu /hello2/runme.sh
就是这样!您的脚本runme.sh
在容器内执行,并且可以访问附近的文件。感谢-v /hello:/hello2:ro
指令。它以只读/hello
模式将主机的文件夹/hello2
映射到容器的文件夹ro
。
请注意,您可以使用相同的名称,只是为了显示不同而对它们进行了区别。