Как установить флаг в точке входа контейнера Docker - PullRequest
0 голосов
/ 11 марта 2019

У меня есть Dockerfile с точкой входа:

ENTRYPOINT ["bash", "-c", "source /code/entrypoint.sh | ts '[%Y-%m-%d 
%H:%M:%S]' &>> /output/stderr.log"]

и команда в entrypoint.sh:

fmriprep /input /output participant --fs-license-file 
/opt/freesurfer/license.txt --use-aroma --ignore fieldmaps --n_cpus 12 -- 
force-bbr --participant_label "${ids[@]}" -w /output

Как мне установить флаги для команды внутри точки входа, например, добавить флаг --some_flag в команду fmriprep, чтобы запустить ее с

docker run my_image --some-flag

Ответы [ 3 ]

1 голос
/ 11 марта 2019

Вы должны иметь возможность передать некоторую переменную окружения из команды run в CMD, прежде чем будет запущен «cmd». Для этого попробуйте использовать предложение ' -e ' следующим образом (не проверено, но должно работать):

docker run my_image -e 'EXTRA_OPTS=--some-flag'

и в вашей команде:

fmriprep /input /output participant --fs-license-file 
/opt/freesurfer/license.txt --use-aroma --ignore fieldmaps --n_cpus 12 -- 
force-bbr --participant_label "${ids[@]}" -w /output $EXTRA_OPTS

Это основная идея

0 голосов
/ 12 марта 2019

Если вы используете форму JSON-массива ENTRYPOINT, то все в CMD передается точке входа в качестве аргументов командной строки.

Я бы рекомендовал не пытаться писать сложные сценарии, встроенные вфайл Dockerfile или docker-compose.yml.Напишите обычный скрипт COPY на изображении и сделайте этот скрипт ENTRYPOINT.Он может ссылаться на переменную оболочки "$@", чтобы запустить ее CMD.

Например, я мог бы реорганизовать ваш скрипт в:

#!/bin/bash
# I am /entrypoint.sh
"$@" | ts '[%Y-%m-%d %H:%M:%S]' &>> /output/stderr.log
#!/bin/bash
# I am /run.sh
fmriprep /input /output participant --fs-license-file  /opt/freesurfer/license.txt --use-aroma --ignore fieldmaps --n_cpus 12 --force-bbr --participant_label "${ids[@]}" -w /output $EXTRA_OPTS

И затем написать Dockerfile:

...
COPY entrypoint.sh run.sh /
ENTRYPOINT ["/entrypoint.sh"]
CMD ["/run.sh"]

И тогда вы можете запустить:

docker run my_image /run.sh --some-flag

Вы также можете запустить обычные команды отладки, такие как:

docker run --rm -it my_image /bin/sh
docker run --rm my_image cat /run.sh

В этом конкретномНапример, я бы, вероятно, использовал внешнюю систему для форматирования и захвата сообщений журнала, а не пытался сделать это внутри контейнера.Например, маршрутизация журналов контейнера Docker в logstash - довольно типичная установка.

0 голосов
/ 11 марта 2019

Передайте переменную среды:

docker run -e flag=somevalue my_image

Вы можете получить доступ к флажку через $flag внутри вашего Dockerfile, который вы можете передать своему script

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...