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

时间:2019-03-11 14:01:53

标签: 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-aroma --ignore fieldmaps --n_cpus 12 -- 
force-bbr --participant_label "${ids[@]}" -w /output

我如何在入口点内为命令设置标志,例如将标志--some_flag添加到fmriprep命令以使用

运行它
docker run my_image --some-flag

3 个答案:

答案 0 :(得分:1)

在触发“ 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

这是基本思想

答案 1 :(得分:0)

传递环境变量:

docker run -e flag=somevalue my_image

您可以通过$flag内的Dockerfile访问标志,并将其传递给script

答案 2 :(得分:0)

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

我鼓励不要尝试在Dockerfiledocker-compose.yml文件中内联编写复杂的脚本。编写一个普通脚本,COPY写入图像,然后将该脚本设为ENTRYPOINT。它可以引用shell变量"$@"来运行其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是一种非常典型的设置。