前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker Entry Script 详解

Docker Entry Script 详解

作者头像
beginor
发布2020-08-10 14:59:00
6630
发布2020-08-10 14:59:00
举报
文章被收录于专栏:张志敏的技术专栏

Docker Entry Script 详解

Dockerfile 的 ENTRYPOINT 通常是一个脚本文件, 用来启动和关闭 Docker 中的应用。 接下来就以 Linux 下常用的 Jexus 服务器为例, 来说明如何正确的启动和关闭 Docker 应用。

Docker 应用启动

根据 Jexus 的文档, Jexus 服务器启动只需要使用命令 /usr/jexus/jws start 即可, 所以启动非常简单, 只要定义一个函数来调用 /usr/jexus/jws start 即可:

代码语言:javascript
复制
# a function to start jexus server
function start_jws {
  /usr/jexus/jws start
}

调用完 jws start 之后, 用 ps a 命令查看, 可以看到如下进程:

代码语言:javascript
复制
# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
   36 pts/0    00:00:00 JwsMain
   43 pts/0    00:00:00 jwss
   95 pts/0    00:00:00 ps

只要有 JwsMainjwss 两个进程在运行, 则表示 Jexus 服务器正在运行。

等待应用关闭

由于 Docker 是单进程的, 如果 Jexus 服务关闭了, Docker 进程也应该退出, 所以需要一个函数来判断 Jexus 服务器的运行。

JwsMainjwss 两个命令位于 /usr/jexus 目录下, 只要这两个进程在运行, 就表示 Jexus 还在运行。 如果没有了这两个进程, 则表示 Jexus 已经退出。 所以判断 Jexus 运行的标志就是位于 /usr/jexus 目录下的进程是否存在, 这个可以使用 pgrep 来判断:

代码语言:javascript
复制
# pgrep -f "/usr/jexus"
36
43

接下来编写一个 wait_for_exit 函数, 每隔一秒钟检查一下是否有位于 /usr/jexus 目录下的进程存在, 如果没有, 则退出, 代码如下:

代码语言:javascript
复制
# a function that spins, stopping every 1s to check if any jexus
# processes are running. the loop terminates when no running jexus 
# processesa are found.
function wait_for_exit {
  while pgrep -f "/usr/jexus" > /dev/null; do
    /bin/sleep 1
  done
  echo "All jexus process have stopped."
}

处理应用关闭

Jexus 的关闭也很容易, 只要调用 /usr/jexus/jws stop , 如下所示:

代码语言:javascript
复制
# a function to stop jexus server
function stop_jws {
  /usr/jexus/jws stop
}

关键是如何做到让 Docker 停止时自动调用这个 stop_jws 函数。 因此需要向主进程发送一个信号通知, 当主进程停止时, 调用 stop_jws 函数。

先定义一个 signal_trap 函数, 调用 stop_jws 函数来关闭 Jexus 服务器:

代码语言:javascript
复制
# a function that is called whenever a signal is caught requesting that
# the process be terminated. in most cases, this will come from Docker
# as this script will be running as PID 1.
function signal_trap {
  echo "A SIGTERM or SIGINT signal was caught; trying to shut down."
  stop_jws
}

向主进程发送一个信号通知, 让主进程知道终止时需要调用 signal_trap 函数来关闭 Jexus 服务器。

代码语言:javascript
复制
# trap termination signals and stop the server processes. this is
# necessary because Docker will send SIGTERM to the container's
# PID 1 when it tries to stop the container. since Bash doesn't
# pass this along, we have to handle it ourselves.
trap signal_trap SIGTERM SIGINT

调用 start_jws 启动 Jexus 服务器之后, 立即调用 wait_for_exit 等待:

代码语言:javascript
复制
# begin the server startup process.
start_jws
echo "Listening for termination signals..."
# loop until all jexus processes are finished.
wait_for_exit

上面写的比较零散, 点击这里查看最终的 bootstrap.sh 文件, 也可以轻松的修改成其它应用的启动脚本。

PS: 也可以直接下载我的 beginor/jexus-x64 镜像来使用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Docker Entry Script 详解
    • Docker 应用启动
      • 等待应用关闭
        • 处理应用关闭
        相关产品与服务
        容器镜像服务
        容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档