我正在将服务脚本传递给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
答案 0 :(得分:1)
通常,您不将服务脚本与Docker一起使用。同样,通常,您永远不会在容器内重新启动服务;而是停止现有容器,将其删除,然后开始一个新容器。
标准模式是将要尝试运行的任何服务直接启动为前台进程。 (没有/etc/init.d
,service
或systemctl
。)您可以从显示的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运行,则它将启动已启用的服务脚本,就像在普通计算机上使用时一样。