为什么我看不到任何 docker 日志?
Why cant I see any docker logs?
我有一个简单的脚本,每 2 秒打印一次 hello。
# entry.py
import time
while True:
print("hello")
time.sleep(2)
我有一个非常简单的 docker 文件,运行 是这个脚本。
FROM python:3.9
COPY entry.py entry.py
CMD python entry.py
首先我构建 docker 图像:
$ docker build -t dtest .
现在我 运行 它带有 -it
选项,它按预期工作。
$ docker run -it dtest
# hello printed to screen every two seconds
但是当我 运行 它处于分离模式,然后尝试查看日志时,我什么也没看到。
$ docker run -d dtest
e19f7285c098af582e163354be84774d1307b2409337cb03bdd217292899bdb7
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e19f7285c098 dtest "/bin/sh -c 'python …" 20 seconds ago Up 18 seconds epic_chatterjee
$ docker logs epic_chatterjee
# nothing is shown, exits
$ docker logs -f epic_chatterjee
# a cursor keeps blinking but nothing shown
这与Python缓冲输出的方式有关。由于写入 stdout 的计算量很大,它会尝试收集大缓冲区并仅在没有连接终端的情况下偶尔刷新它们。
您可以将 Python 代码更改为:
print("Hello", flush=True)
或 运行 python
带有 -u
标志,强制无缓冲输出
FROM python:3.9
COPY entry.py entry.py
ENTRYPOINT ["python", "-u"]
CMD ["entry.py"]
我有一个简单的脚本,每 2 秒打印一次 hello。
# entry.py
import time
while True:
print("hello")
time.sleep(2)
我有一个非常简单的 docker 文件,运行 是这个脚本。
FROM python:3.9
COPY entry.py entry.py
CMD python entry.py
首先我构建 docker 图像:
$ docker build -t dtest .
现在我 运行 它带有 -it
选项,它按预期工作。
$ docker run -it dtest
# hello printed to screen every two seconds
但是当我 运行 它处于分离模式,然后尝试查看日志时,我什么也没看到。
$ docker run -d dtest
e19f7285c098af582e163354be84774d1307b2409337cb03bdd217292899bdb7
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e19f7285c098 dtest "/bin/sh -c 'python …" 20 seconds ago Up 18 seconds epic_chatterjee
$ docker logs epic_chatterjee
# nothing is shown, exits
$ docker logs -f epic_chatterjee
# a cursor keeps blinking but nothing shown
这与Python缓冲输出的方式有关。由于写入 stdout 的计算量很大,它会尝试收集大缓冲区并仅在没有连接终端的情况下偶尔刷新它们。
您可以将 Python 代码更改为:
print("Hello", flush=True)
或 运行 python
带有 -u
标志,强制无缓冲输出
FROM python:3.9
COPY entry.py entry.py
ENTRYPOINT ["python", "-u"]
CMD ["entry.py"]