【问题标题】:Docker Apache graceful shutdownDocker Apache 优雅关闭
【发布时间】:2016-10-25 08:41:26
【问题描述】:

我们正在尝试使操作系统信号(TERMKILL 等)到达使用 shell 脚本启动的 Apache 服务器。这是我们正在尝试做的事情:-

1) 我们有一个以 :

结尾的 docker 文件
 CMD ["sh","-c","/apps/scripts/run.sh" ]

这个想法是启动 apache 并将 docker 容器放在上面。

2) 然后我们有一个shell脚本run.sh:-

_term() {
  echo "Caught signal!"
  apachectl -k graceful-stop
}

trap _term SIGINT SIGTERM SIGWINCH

apachectl start &

PID=$!

echo "APACHE PID is ${PID}"

wait $PID

trap - SIGINT SIGTERM SIGWINCH

wait $PID

EXIT_STATUS=$?

echo "Exiting with Exit Status of ${EXIT_STATUS}"

这个想法是等待 Apache 服务器并在收到 SIGTERM/SIGINT/SIGWINCH 时优雅地杀死它。

我们面临的问题是:-

1) 在运行 docker 容器时,它会依次执行脚本,它会抛出以下错误并退出:

等待:pid 102 不是这个 shell 的子代

似乎 shell 脚本没有将 apachectl start & 视为子进程。

我们如何确保 shell 脚本向 apache 发送信号?

任何关于如何去做的帮助将不胜感激!

【问题讨论】:

  • 您需要这样做吗?对于官方的httpd 镜像,Dockerfile 命令只是在前台模式下运行httpd
  • @EltonStoneman 是的..这是一个要求!....关于我们如何将 apache 的日志定向到作为后台进程运行的 STDOUT 的任何想法?
  • apachectl -k graceful-stop 呢?

标签: linux apache shell unix docker


【解决方案1】:

dumb-init 这样的东西很适合这个。您可以使用-r 15:28SIGTERM 重写为SIGWICHSIGWICHis the samegraceful-stop

因此,您的 Dockerfile 将具有以下内容: CMD ["dumb-init", "-v", "--rewrite", "15:28", "apachectl -D FOREGROUND"]

输出如下:

[core:notice] AH00094: Command line: '/usr/sbin/apache2 -D FOREGROUND'
[dumb-init] Received signal 15.
[dumb-init] Translating signal 15 to 28.
[dumb-init] Forwarded signal 28 to children.
[mpm_event:notice] AH00492: caught SIGWINCH, shutting down gracefully
[dumb-init] Received signal 17.
[dumb-init] A child with PID 16701 exited with exit status 0.
[dumb-init] Translating signal 15 to 28.
[dumb-init] Forwarded signal 28 to children.
[dumb-init] Child exited with status 0. Goodbye.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2017-04-06
    • 2019-09-26
    • 2014-02-05
    相关资源
    最近更新 更多