考虑以下Dockerfile:
FROM ubuntu:16.04
RUN apt-get update && \
apt-get install -y apache2 && \
apt-get clean
ENTRYPOINT ["apache2ctl", "-D", "FOREGROUND"]
使用命令docker run -p 8080:80 <image-id>
运行容器时,容器启动并保持运行,允许从主机https://localhost:8080
按预期访问默认的Apache网页。但是,使用此运行命令,我也无法按预期使用Ctrl+C
退出容器,因为容器未使用-it
选项启动。现在,如果将-it
选项添加到run命令,则容器会在启动后立即退出。这是为什么?有没有一种优雅的方法让apache在Ctrl+C
退出时在前台运行?
答案 0 :(得分:2)
此行为是由Apache引起的,它不是Docker的问题。 Apache旨在在收到SIGWINCH
信号时正常关闭。以交互方式运行容器时,SIGWINCH
信号从主机传递到容器,有效地指示Apache正常关闭。在某些主机上,容器可能在启动后立即退出。在其他主机上,容器可以保持运行,直到调整终端窗口的大小。
通过查看Apache日志文件,可以确认这是容器退出后问题的根源,如下所示:
# Run container interactively:
docker run -it <image-id>
# Get the ID of the container after it exits:
docker ps -a
# Copy the Apache log file from the container to the host:
docker cp <container-id>:/var/log/apache2/error.log .
# Use any text editor to review the log file:
vim error.log
# The last line in the log file should contain the following:
AH00492: caught SIGWINCH, shutting down gracefully
来源:
答案 1 :(得分:1)
您需要做的就是将-d
选项传递给运行命令:
docker run -d -p 8080:80 my-container
答案 2 :(得分:1)
正如yamenk所提到的,守护进程的工作原理是将其发送到后台并取消调整窗口大小。
由于后续文章提到可能需要在前台运行,所以有一种很好的方法可以在守护进程后模拟这种体验:
docker logs -f容器名称
这会将通常的标准输出(如“ GET / HTTP ...”)连接消息放回控制台,以便您观看它们的流动。
现在,您可以调整窗口和内容的大小,并且仍然可以查看故障排除信息。
答案 3 :(得分:0)
我在 Windows 10、Docker Engine v20.10.7 下的 wsl2 上也遇到了这个问题
解决方法:
# start bash in httpd container:
docker run --rm -ti -p 80:80 httpd:2.4.48 /bin/bash
# inside container execute:
httpd -D FOREGROUND
现在 Apache httpd 会一直运行,直到您按下 CTRL-C 或调整(?!)终端窗口的大小。
关闭httpd后,输入:
exit
离开容器