2017-10-13 86 views
6

我想创建一个高山和Apache的码头图像。我使用tini作为“init” - 系统。它工作,直到我分离并重新附加到容器。在连接到容器后,apache退出并停止容器。我不知道问题是什么。有没有人有Docker,Alpine和Apache的问题?Apache与Docker高山Linux

Dockerfile看起来是这样的(之前,我用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"] 

输入输出和泊坞窗CLI:

~/Desktop/[email protected] 
$ docker run -itd test1 
a793bad5d4350f58893909f1552c9f2978d8e2952960ac667f8dcb2bf7a3516e 

~/Desktop/[email protected] 
$ 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/[email protected] 
$ 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附加到conta时,它接收到SIGWINCH(窗口大小更改) iner:

[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?

回答

2

这是事实,Apache使用SIGWINCH触发正常关机:

docker kill ----signal=SIGWINCH apache 

docker-library/httpd issue 9提到

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

实际上,您只需要-d:请参阅 PR669
在你的情况下,你已经在使用-dit运行图像,所以检查只保留-d可能会有所帮助。

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

OP Sebi2020确认in the comments

如果我不连接TTY信号未发出

所以如果可能的话,避免-t,如果需要,添加docker exec -t session如果你需要tty。

+0

我在寻找一个解决方案,它不限制你的方式例如运行泊坞窗容器用'-t'或不用。 – Sebi2020

+0

@ Sebi2020好的,但首先,只会保持你的情况下工作? – VonC

+0

是的,如果我不连接tty,则不发送信号。 – Sebi2020

1

你可以尝试切换您从exec formCMD指令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 -it至或stop作为您想要的容器。

参考文献:
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

+0

但是这绕过了tini,收割僵尸进程。 – Sebi2020