docker run,docker exec和日志

Tri*_*tan 5 nginx docker alpine-linux

如果我做 :

docker run --name nginx -d nginx:alpine /bin/sh -c 'echo "Hello stdout" > /dev/stdout'
Run Code Online (Sandbox Code Playgroud)

我可以看到“ Hello stdout”:

docker logs nginx
Run Code Online (Sandbox Code Playgroud)

但是当容器运行时(docker run --name nginx -d nginx:alpine)我做了:

docker exec nginx /bin/sh -c 'echo "Hello stdout" > /dev/stdout'
Run Code Online (Sandbox Code Playgroud)

或当我用以下方式连接容器时:

docker exec -it nginx /bin/sh
Run Code Online (Sandbox Code Playgroud)

然后 :

echo "Hello stdout" > /dev/stdout
Run Code Online (Sandbox Code Playgroud)

我在Docker日志中看不到任何东西。而且由于我的Nginx访问日志被重定向到/ dev / stdout,所以我也看不到它们。

此标准输出在这里发生了什么?

use*_*097 7

当你docker exec可以看到你有几个过程

/ # ps -ef
PID   USER     TIME   COMMAND
    1 root       0:00 nginx: master process nginx -g daemon off;
    6 nginx      0:00 nginx: worker process
    7 root       0:00 /bin/sh
   17 root       0:00 ps -ef
/ # 
Run Code Online (Sandbox Code Playgroud)

在 Linux 中,每个进程在 /proc/pid/fd 中都有自己的 stdin、stdout、stderr(和其他文件描述符)

所以,用你的docker exec(pid 7) 你显示一些东西

/proc/7/fd/1

如果这样做ls -ltr /proc/7/fd/1,它会显示类似的内容 /proc/4608/fd/1 -> /dev/pts/2,这意味着输出正在发送到终端

而你的 nginx 进程(pid 1)显示他的输出

/proc/1/fd/1

如果这样做ls -ltr /proc/1/fd/1,它会显示类似的内容/proc/1/fd/1 -> pipe:[184442508],这意味着输出正在发送到 docker 日志驱动程序

  • 好的,我会回答我自己的问题: 1. 我猜 docker exec 会创建一个不是主进程的 shell 2. 不,不仅有一个 /dev/stdout,它是一个链接到当前进程的动态设备 3 . 如果您不尝试从容器内部显示文件,则说明实际上有效,而仅使用“docker logs nginx”将显示访问日志和错误日志。如果您需要持久日志,只需使用卷。 (2认同)