如何在不复制的情况下使用本地输入文件 运行 容器中的命令

How to Run a Command in a Container Using Local Input Files without Copying

我是 docker 和容器的新手。我有一个包含 MRI 分析软件的容器。在这个容器中还有许多其他软件,主要软件从中提取命令。我想 运行 来自此容器中的一个软件的单个命令使用位于外部硬盘驱动器上的研究数据,该硬盘驱动器插入我的本地机器 运行ning 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'

任何人都可以指出正确的方向吗?

因此,如果我没猜错,您需要执行一些 shell 脚本并提供上下文(如本地文件)。

方法很简单。

假设您的脚本和所有需要的文件位于您的 主机 PC 的 /hello 文件夹中(不管它们是否存储在一起,只是显示技术)。

/hello
  - runme.sh
  - datafile1
  - datafile1

您将此文件夹装载到您的容器中,以便可以访问其中的文件。如果您不需要 容器来修改它们,最好以readonly 模式挂载。

您这样启动 docker:

docker run -it -v /hello:/hello2:ro ubuntu /hello2/runme.sh

就是这样!您的脚本 runme.sh 在容器内执行,并且可以访问附近的文件。感谢 -v /hello:/hello2:ro 指令。它以只读 ro 模式将主机的文件夹 /hello 映射到容器的文件夹 /hello2

请注意,您可以使用相同的名称,我只是对它们进行了区分以显示差异。