0

我有带有入口点的 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
4

3 回答 3

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

这是基本思想

于 2019-03-11T14:39:07.440 回答
0

传递一个环境变量:

docker run -e flag=somevalue my_image

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

于 2019-03-11T14:41:42.093 回答
0

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

我鼓励不要尝试在Dockerfileordocker-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 是一个非常典型的设置。

于 2019-03-12T00:38:30.680 回答