Если вы используете форму 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 - довольно типичная установка.