考虑以下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网页。但是,使用此run命令时,我无法使用Ctrl+C
退出容器,这也是预期的,因为容器不是使用-it
选项启动的。如果在run命令中添加-it
选项,那么container在启动后会立即退出,这是为什么呢?有没有一种优雅的方法可以让apache在前台运行,同时在Ctrl+C
上退出?
5条答案
按热度按时间nnt7mjpx1#
您需要做的只是将
-d
选项传递给run命令:mbskvtky2#
此行为是由Apache引起的,与Docker无关。Apache被设计为在收到
SIGWINCH
信号时正常关闭。当以交互方式运行容器时,SIGWINCH
信号从主机传递到容器,有效地通知Apache正常关闭。在某些主机上,容器可能在启动后立即退出。在其他主机上,容器可能会一直运行,直到终端窗口调整大小。通过查看Apache日志文件,可以确认这是容器退出后的问题来源,如下所示:
资料来源:
qltillow3#
正如yamenk提到的,daemonizing之所以有效,是因为您将其发送到后台并解耦窗口大小调整。
由于后续文章提到在前台运行可能是可取的,因此有一个很好的方法来模拟守护进程后的体验:
码头工日志-f集装箱-名称
这将把常见的标准输出(如“GET / HTTP...”连接消息)放回控制台,以便您可以查看它们的流程。
现在你可以调整窗口大小和东西,仍然可以看到你的故障排除信息。
rdlzhqv94#
我在Windows 10下的wsl2上也遇到了这个问题,Docker引擎v20.10.7
解决方法:
现在Apache httpd会一直运行,直到您按下CTRL-C或调整终端窗口的大小(?!)。
关闭httpd后,键入:
离开集装箱
xqkwcwgp5#
解决方法是将输出通过管道传输到
cat
:注:使用
-i
和-t
非常重要。Ctrl+C可以正常工作,调整终端大小不会关闭Apache。