使用-it选项时Docker容器退出

zrfyljdw  于 2023-01-01  发布在  Docker
关注(0)|答案(5)|浏览(149)

考虑以下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上退出?

nnt7mjpx

nnt7mjpx1#

您需要做的只是将-d选项传递给run命令:

docker run -d -p 8080:80 my-container
mbskvtky

mbskvtky2#

此行为是由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

资料来源:

qltillow

qltillow3#

正如yamenk提到的,daemonizing之所以有效,是因为您将其发送到后台并解耦窗口大小调整。
由于后续文章提到在前台运行可能是可取的,因此有一个很好的方法来模拟守护进程后的体验:
码头工日志-f集装箱-名称
这将把常见的标准输出(如“GET / HTTP...”连接消息)放回控制台,以便您可以查看它们的流程。
现在你可以调整窗口大小和东西,仍然可以看到你的故障排除信息。

rdlzhqv9

rdlzhqv94#

我在Windows 10下的wsl2上也遇到了这个问题,Docker引擎v20.10.7
解决方法:

# 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

离开集装箱

xqkwcwgp

xqkwcwgp5#

解决方法是将输出通过管道传输到cat

docker run -it -p 8080:80 <image-id> | cat

注:使用-i-t非常重要。
Ctrl+C可以正常工作,调整终端大小不会关闭Apache。

相关问题