Как выполнить команду в контейнере, используя локальные входные файлы без копирования - PullRequest
0 голосов
/ 29 декабря 2018

Я новичок в докере и контейнерах.У меня есть контейнер, состоящий из программного обеспечения для анализа МРТ.В этом контейнере много других программ, из которых основное программное обеспечение черпает свои команды.Я хотел бы запустить одну команду из одного из программ в этом контейнере, используя данные исследований, которые находятся на внешнем жестком диске, подключенном к моей локальной машине, на которой выполняется докер.

Я знаю, что естьКоманда cp для копирования файлов (таких как сценарии) в контейнеры и большинство других вопросов в этом направлении, похоже, рекомендует скопировать файлы с вашего локального компьютера в контейнер и затем запустить сценарий (или любой другой) из контейнера.В моем случае мне нужен контейнер для доступа к данным из отдельных папок в структуре каталогов, и копирование по всему каталогу невозможно, так как он довольно большой.

Я, честно говоря, просто хочу знать, как я могу запустить одинКоманда внутри докера, используя входные данные, присутствующие на моей локальной машине.Я запустил 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/... - это файлы на моем локальном компьютере, к которым я хотел бы получить доступ.Я понимаю, что расположение файлов является проблемой, так как я не могу завершить пути в этой команде;когда я запускаю это, я получаю следующий вывод:

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'

Может кто-нибудь указать мне правильное направление?

1 Ответ

0 голосов
/ 29 декабря 2018

Так что, если я вас правильно понял, вам нужно выполнить какой-нибудь скрипт shell и предоставить контекст (например, локальные файлы).

Способ прост.

Допустим, ваш сценарий и все необходимые файлы находятся в папке /hello вашего хоста ПК (на самом деле независимо от того, сохранены ли онивместе или нет, просто показывая технику).

/hello
  - runme.sh
  - datafile1
  - datafile1

Вы монтируете эту папку в свой контейнер, чтобы сделать файлы доступными внутри.Если вам не нужен контейнер для их изменения, лучше смонтировать в режиме readonly.

Вы запускаете докер так:

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

И все!Ваш скрипт runme.sh выполняется внутри контейнера и имеет доступ к ближайшим файлам.Благодаря директиве -v /hello:/hello2:ro.Он отображает папку хоста /hello в папку контейнера /hello2 в режиме только для чтения ro.

Обратите внимание, что у вас могут быть одинаковые имена, я просто отличал их, чтобы показать разницу.

...