Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将docker容器的所有输出记录到进程1,以便在docker日志中查看它们?_Docker_Logging_Process_Docker Compose - Fatal编程技术网

如何将docker容器的所有输出记录到进程1,以便在docker日志中查看它们?

如何将docker容器的所有输出记录到进程1,以便在docker日志中查看它们?,docker,logging,process,docker-compose,Docker,Logging,Process,Docker Compose,我有一个docker compose文件,它定义了十几个要运行的服务。我有一个CLI,可以启动或停止服务,等等。。。现在,我可以在包含docker compose.yml文件的目录中运行docker compose logs-f,以查看在PID 1上运行的每个容器进程中的stdout和stderr 例如,现在我的一些服务包含一个PythonDjango应用程序,服务上定义的命令(在compose文件中)运行服务器,然后运行tail-f。因此,我将其视为PID 1上的命令,服务器运行在新的PID

我有一个docker compose文件,它定义了十几个要运行的服务。我有一个CLI,可以启动或停止服务,等等。。。现在,我可以在包含
docker compose.yml
文件的目录中运行
docker compose logs-f
,以查看在
PID 1
上运行的每个容器进程中的stdout和stderr

例如,现在我的一些服务包含一个PythonDjango应用程序,服务上定义的
命令(在compose文件中)运行服务器,然后运行
tail-f
。因此,我将其视为PID 1上的命令,服务器运行在新的PID eg 7上,tail-f命令运行在PID eg 8上。现在,我知道我不能杀死这些PID中的任何一个,因为这将向容器发出
exit with code 137
命令。服务器还启动了$n$额外进程,这些进程是gunicorn工作进程

到目前为止,在开发过程中,如果我想签出新代码并进行调试,我会
docker exec
到容器中,杀死工作进程,然后发出另一个run server命令,启动新的工作进程,向我显示所有的输出,而不仅仅是我设置了要打印的日志。这是因为一旦我这样做,docker compose logs的输出不再输出容器中正在输出的内容,这是因为我认为docker只记录PID 1上的输出内容,或者直接从中生成的进程。(我也想知道它是如何做到这一点的。)

现在,我四处探索如何做到这一点,我发现

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log
我认为这应该允许nginx写入这些
.log
位置,同时将输出通过管道传输到stdout和stderr,但随后意识到
docker日志
不会直接从stdout或stderr读取

然后呢,

ln-sf/proc/1/fd/1/var/log/test.log
应该能够写入
.log
文件,输出也指向docker需要的任何东西,以便能够输出到
docker compose logs
,但这也不起作用


那么,如何才能在容器中成功启动另一个进程,将所有输出通过管道传输到
PID 1
的输出?

您需要将所有日志重新连接到stdoutb,但我不只是要日志,我要的是终端输出的整个输出,而不仅仅是日志。使用python,您可以使用
logging.StreamHandler(sys.stdout)
写入stdout,也可以使用
logging.FileHandler(dev\u stdout\u file)
写入文件,但正如我所说,这只是日志。您是说用python打印吗?打印(“测试”,flush=True)也将打印到docker输出。或者更好地使用
sys.stdout.flush()
我被这句话弄糊涂了,运行一个容器,然后在其中执行,然后用您刚才建议的命令启动一个python控制台/脚本,这在docker日志中是不可见的