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,所以我也看不到它们。
此标准输出在这里发生了什么?
当你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 日志驱动程序