0

我将服务脚本传递给 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
4

2 回答 2

1

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

标准模式是将您尝试运行的任何服务作为前台进程直接启动。(不/etc/init.d,,servicesystemctl任何东西。)您可以从您显示的初始化脚本中提取相关命令。我会将您的 ENTRYPOINT 命令替换为

CMD ["elasticsearch"]

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

第二部分是确保数据库数据存储在容器之外。通常您使用该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 之类的编排工具来声明容器参数。

于 2019-07-10T17:11:21.377 回答
1

就服务管理器而言,sysv 初始化脚本属于“分叉”类型。因此它将与启动脚本分离。然后,容器需要 pid 1 上的一些 init 进程来控制后台进程。

如果您不想从 initscript 中提取相关命令,那么您仍然可以使用docker-systemctl-replacement为您做这两件事。如果它作为 CMD 运行,那么它将启动启用的服务脚本,就像在普通机器上使用一样。

于 2019-07-10T23:49:36.030 回答