我有带有入口点的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
答案 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
中的所有内容都将作为命令行参数传递给入口点。
我鼓励不要尝试在Dockerfile
或docker-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是一种非常典型的设置。