Docker没有运行我的整个entrypoint.sh脚本

时间:2018-09-25 19:50:44

标签: bash docker dockerfile

我创建了一个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启动后执行一些命令,以便我可以配置适当的索引并插入一些数据。

1 个答案:

答案 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 &