我创建了一个Docker容器来支撑Elasticsearch。 Elasticsearch由主管启动并管理,该主管也安装在我的Docker容器中。我创建了一个entrypoint.sh脚本,并将以下内容添加到了Dockerfile的末尾
ENTRYPOINT ["/usr/local/startup/entrypoint.sh"]
我的entrypoint.sh脚本如下所示:
#!/bin/bash -x
# Start Supervisor if not already running
if ! ps aux | grep -q "[s]upervisor"; then
echo "Starting supervisor service"
exec/usr/bin/supervisord -nc /etc/supervisor/supervisord.conf
else
echo "Supervisor is currently running"
fi
echo "creating /.es_created"
touch /.es_created
exec "$@"
当我启动时,我的docker容器管理器将启动,然后将成功启动elasticsearch。问题在于,它永远不会执行创建.es_created文件的脚本的最后一位。好像曾经
exec /usr/bin/supervisord -nc /etc/supervisor/supervisord.conf
命令已执行,仅在此处停止。我在#!/ bin / bash中添加了-x,因此我可以在容器上调用docker日志,它可以确认它从不调用最后的echo和touch命令。我觉得我可能缺少有关入口点脚本的一些信息,这就是为什么这样做的原因,但是最终我希望能够在Elasticsearch启动后执行一些命令,以便我可以配置适当的索引并插入一些数据。
答案 0 :(得分:1)
您的猜测
好像曾经是
exec /usr/bin/supervisord -nc /etc/supervisor/supervisord.conf
命令已执行,仅在此处停止。
是正确的,因为bash的exec
命令确实具有以下语义:所执行的指定程序已执行,并替换了父shell进程(它是exec system call)。
因此您的问题实际上不是Docker问题,而是与Bash有关。有关内置exec
shell的更多详细信息,例如,您可以查看此askubuntu question,或阅读bash reference manual中的相应文档。
总而言之,您应该尝试只是写
/usr/bin/supervisord -nc /etc/supervisor/supervisord.conf
如果该命令确实在后台运行,则应该可以。否则,您当然可以附加一个&
:
/usr/bin/supervisord -nc /etc/supervisor/supervisord.conf &