【问题标题】:Apache with Docker Alpine LinuxApache 与 Docker Alpine Linux
【发布时间】:2018-03-25 17:58:59
【问题描述】:

我想用 alpine 和 apache 创建一个 docker 镜像。我使用 tini 作为“初始化”系统。它一直有效,直到我分离并重新连接到容器。附加到容器后,apache 退出并且容器停止。我不知道问题是什么。有人对 docker、alpine 和 apache 有过类似的问题吗?

我的 Dockerfile 看起来像这样(之前,我使用 Alpines 包管理器进行 tini)

FROM alpine
ENV TINI_VERSION v0.16.1
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static /sbin/tini
RUN chmod +x /sbin/tini
RUN apk add --no-cache apache2 \
   && mkdir -p /run/apache2 \
   && ln -sf /dev/stdout /var/log/apache2/access.log \
   && ln -sf /dev/stderr /var/log/apache2/error.log
EXPOSE 80
ENTRYPOINT ["/sbin/tini", "-vvv", "-g", "--"]
CMD ["/usr/sbin/httpd", "-f", "/etc/apache2/httpd.conf", "-DFOREGROUND"]

docker cli 的输入和输出:

~/Desktop/docker_test@laptop-sebi
$ docker run -itd test1
a793bad5d4350f58893909f1552c9f2978d8e2952960ac667f8dcb2bf7a3516e

~/Desktop/docker_test@laptop-sebi
$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             
STATUS              PORTS               NAMES
a793bad5d435        test1               "/sbin/tini -vvv -..."   12 seconds 
ago      Up 11 seconds       80/tcp              sharp_neumann

~/Desktop/docker_test@laptop-sebi
$ docker attach a7
[DEBUG tini (1)] Received SIGCHLD
[DEBUG tini (1)] Reaped child with pid: '5'
[INFO  tini (1)] Main child exited normally (with status '0')
[TRACE tini (1)] No child to wait
[TRACE tini (1)] Exiting: child has exited

更新: 问题似乎是apache2,它在docker附加到容器时接收SIGWINCH(窗口大小更改):

[Sun Oct 15 12:13:24.592575 2017] [mpm_prefork:notice] [pid 5] AH00170: caught SIGWINCH, shutting down gracefully
[DEBUG tini (1)] Received SIGCHLD
[DEBUG tini (1)] Reaped child with pid: '5'
[INFO  tini (1)] Main child exited normally (with status '0')
[TRACE tini (1)] No child to wait
[TRACE tini (1)] Exiting: child has exited

Apache 滥用该信号与 apachectl 实用程序一起正常关闭服务器。是否有可能阻止此信号,使其不会传递给 apache?

【问题讨论】:

    标签: apache docker dockerfile init


    【解决方案1】:

    确实 Apache 使用 SIGWINCH 来触发优雅关闭:

    docker kill ----signal=SIGWINCH apache
    

    docker-library/httpd issue 9 提及

    即使只是删除“-t”也应该在窗口调整大小时删除SIGWINCH 的发送。

    实际上,您只需要-d:见 PR669
    在您的情况下,您已经使用 -dit 运行映像,因此请检查是否仅保留 -d 可能会有所帮助。

    bug id 1212224 中描述了原始问题(在 httpd 端,而不是 docker)。

    OP Sebi2020 确认in the comments

    如果我不连接 tty,则不会发送信号

    因此,如果可能,请避免使用 -t,如果需要,请在需要 tty 时添加 docker exec -t session

    【讨论】:

    • 我正在寻找一种解决方案,它不会限制您运行 docker 容器的方式,例如-t 与否。
    • @Sebi2020 好的,但首先,只保留 -d 对你的情况有用吗?
    • 是的,如果我不连接 tty,则不会发送信号。
    • @Sebi2020 好的。我已经编辑了答案以包含一个可能的解决方法(测试)
    【解决方案2】:

    您可以尝试将您的 CMD 指令从 exec form 切换到 shell form,这会导致在容器运行时使用 /bin/sh -c <...>

    CMD /usr/sbin/httpd -f /etc/apache2/httpd.conf -DFOREGROUND 
    # or use ENTRYPOINT with the same shell form
    

    然后它不再有 PID 1 并且 Unix 信号不会传递给子进程。

    但我不确定(取决于您的工作流程)您是否可以按照自己的意愿 attachexec -itstop 容器。

    参考:
    http://www.johnzaccone.io/entrypoint-vs-cmd-back-to-basics/
    (事实 3)
    https://docs.docker.com/engine/reference/builder/#cmd https://docs.docker.com/engine/reference/builder/#shell-form-entrypoint-example

    【讨论】:

    • 但这绕过了tini,它会收获僵尸进程。
    猜你喜欢
    • 2020-09-21
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多