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

时间:2018-01-03 23:28:32

标签: docker dockerfile

考虑以下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退出时在前台运行?

4 个答案:

答案 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

离开容器