我有一个在节点docker容器中运行的node.js脚本,该脚本当前将其输出转储到容器和STDOUT内的日志文件中。许多官方的docker镜像都允许您运行docker logs container
来查看该容器中正在运行的内容的错误。
我看到许多引用,Docker只是捕获了STD输出,而这是docker logs container
所看到的,但是我找不到任何有关如何通过容器中运行的脚本正确设置它的文档。
当前,我的Dockerfile是以一种开发方式设置的,最后一行是
ENTRYPOINT [ "npm", "run", "watch"]
监视我的文件是否有更改,以在容器中运行构建脚本。因此,为了进行开发,我目前使用docker exec -it container /bin/sh
并手动执行脚本。
当我使用docker logs container
时,从容器中手动运行该脚本时,看到的是npm构建链中的错误,而脚本中却看不到任何错误。
我的脚本使用
process.stdout.write(data)
process.stderr.write(data)
在我完全重做我的Dockerfile脚本之前,我是否认为docker logs
从具有PID 1的进程中重定向STDOUT和STDERR 是正确的, ?
如果我想使用docker logs
捕获脚本输出,那只是更改ENTRYPOINT
以便直接运行我的脚本的一种情况?
ENTRYPOINT [ "node", "myscript" ]
答案 0 :(得分:1)
您的假设很接近-Docker记录用于启动容器的任何进程的输出。那确实是PID 1,但是某些容器将使用“伪”初始化进程,因此主进程不会像这样运行(例如Tini),如果使用docker run --init
,情况也是如此。
在您的情况下,如果您docker exec
进入容器并运行命令,则该输出将被发送到您的Shell会话,因此不会被记录。如果将ENTRYPOINT
更改为直接运行脚本,那么Docker将看到脚本的输出。
或者,如果要在不更改容器入口点的情况下将输出发送到容器日志收集器,则可以将输出发送到容器中PID 1的stdio流。例如,要将输出发送到PID 1的stdout:
$ docker exec -it $RUNNING_CONTAINER bash
container$ echo test >> /proc/1/fd/0