如何使用传递给ENTRYPOINT的服务脚本启动单个进程

时间:2019-07-10 16:54:08

标签: linux docker docker-entrypoint

我正在将服务脚本传递给ENTRYPOINT。服务已启动但已退出。 我必须使用ENTRYPOINT或CMD的服务脚本为每个容器启动一个进程。这样,我可以使用服务脚本在容器内重新加载配置。我也尝试使用CMD语句,但是它启动了服务,但立即存在容器。

ENTRYPOINT ["/etc/init.d/elasticsearch", "start"]

/etc/init.d/elasticsearch脚本具有以下代码,以作为守护程序启动服务。

cd $ES_HOME
echo -n $"Starting $prog: "
daemon --user elasticsearch --pidfile $pidfile $exec -p $pidfile -d
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval

是否无法使用启动脚本启动服务并保持容器运行?

用于创建和运行容器的命令。

docker build -f Dockerfile -t="elk/elasticsearch" .
docker run -d elk/elasticsearch
docker run -it elk/elasticsearch bash

2 个答案:

答案 0 :(得分:1)

通常,您不将服务脚本与Docker一起使用。同样,通常,您永远不会在容器内重新启动服务;而是停止现有容器,将其删除,然后开始一个新容器。

标准模式是将要尝试运行的任何服务直接启动为前台进程。 (没有/etc/init.dservicesystemctl。)您可以从显示的init脚本中提取相关命令。我将您的ENTRYPOINT命令替换为

CMD ["elasticsearch"]

(但还要仔细检查Elasticsearch documentation,以防万一还有其他一些重要的命令行选项)。

第二部分是确保数据库数据存储在容器的外部。通常,您使用docker run -v选项将一些备用存储装入容器。例如:

docker run \
  --name elasticsearch \
  -p 9200:9200 \
  -v ./elasticsearch:/var/data/elasticsearch \
  imagename

完成此操作后,您可以随意停止,删除和重新创建容器,这是重新启动服务的正确方法。 (如果基础映像发生更改,则需要执行此操作;如果映像软件或基础Linux发行版中存在错误修复或安全问题,则会发生这种情况。)

docker stop elasticsearch
docker rm elasticsearch
docker run -- name elasticsearch ...

您可以编写一个简单的shell脚本来保存docker run命令,或使用编排工具(如Docker Compose)来声明容器参数。

答案 1 :(得分:1)

就服务管理器而言,sysv初始化脚本的类型为“ forking”。因此它将与启动脚本分离。然后,容器需要在pid 1上执行一些初始化过程,以控制后台进程。

如果您不想从初始化脚本中提取相关命令,则仍可以使用docker-systemctl-replacement为您完成这两项操作。如果它以CMD运行,则它将启动已启用的服务脚本,就像在普通计算机上使用时一样。