繁体   English   中英

Apache与Docker Alpine Linux

[英]Apache with Docker Alpine Linux

我想用alpine和apache创建一个docker图像。 我使用tini作为“init”系统。 它工作,直到我分离并重新连接到容器。 连接到容器后,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使用SIGWINCH来触发正常关闭:

docker kill ----signal=SIGWINCH apache

docker-library / httpd issue 9提到

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

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

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

OP Sebi2020 在评论中证实:

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

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

您可以尝试将您的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信号不传递给子进程。

但我不确定(取决于您的工作流程)是否可以按照您的exec -it 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM