Bash 如何在docker容器的入口点设置标志

Bash 如何在docker容器的入口点设置标志,bash,docker,Bash,Docker,我有一个带有入口点的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-a

我有一个带有入口点的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
我如何在entrypoint内为命令设置标志,例如将flag-some_标志添加到fmriprep命令中以运行它

docker run my_image --some-flag

在触发CMD之前,您应该能够将一些环境变量从运行命令传递到CMD。 要做到这一点,请尝试以未经测试的方式使用该子句,但应能:

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

这就是传递环境变量的基本思想:

docker run -e flag=somevalue my_image

您可以通过Dockerfile中的$flag访问flag,您可以将其传递给脚本

如果您使用ENTRYPOINT的JSON数组形式,则CMD中的所有内容都将作为命令行参数传递给ENTRYPOINT

我鼓励不要尝试在Dockerfile或docker-compose.yml文件中内联编写复杂的脚本。编写一个普通脚本,将其复制到图像中,并将该脚本作为入口点。它可以引用shell变量$@来运行其CMD

例如,我可以将您的脚本重构为:

!/bin/bash 我是/entrypoint.sh $@|ts'[%Y-%m-%d%H:%m:%S]'&>/output/stderr.log !/bin/bash 我是/run.sh fmriprep/input/output participant-fs许可证文件/opt/freesurfer/license.txt-使用aroma-忽略字段映射-n_CPU 12-强制bbr-participant_标签${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是一种非常典型的设置。

这很有意义,不超过1个标志?不,您可以在额外选项中传递尽可能多的标志。最好只对所有标记使用一个环境变量,因为这是可以预测的:这将是所有额外标记的一个环境变量。这应该是要测试的类似于stg的'EXTRA_OPTS=-some-flag-some-other-flag'!