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