为什么在一个独立的Docker容器中运行Python应用程序时没有任何输出?

324
我有一个Python(2.7)应用程序,在我的dockerfile中启动。
CMD ["python","main.py"]

main.py启动时打印一些字符串,然后进入一个循环:

print "App started"
while True:
    time.sleep(1)

只要我使用-it标志启动容器,一切都按预期工作:
$ docker run --name=myapp -it myappimage
> App started

我之后可以通过日志看到相同的输出。
$ docker logs myapp
> App started

如果我尝试使用-d标志运行相同的容器,容器似乎正常启动,但我看不到任何输出。
$ docker run --name=myapp -d myappimage
> b82db1120fee5f92c80000f30f6bdc84e068bafa32738ab7adb47e641b19b4d1
$ docker logs myapp
$ (empty)

但是容器似乎仍在运行;
$ docker ps
Container Status ...
myapp     up 4 minutes ... 

附件也没有显示任何内容。
$ docker attach --sig-proxy=false myapp
(working, no output)

有什么想法出了问题吗?在后台运行时,“print”的行为是否不同?
Docker版本:
Client version: 1.5.0
Client API version: 1.17
Go version (client): go1.4.2
Git commit (client): a8a31ef
OS/Arch (client): linux/arm
Server version: 1.5.0
Server API version: 1.17
Go version (server): go1.4.2
Git commit (server): a8a31ef
14个回答

4

在运行Django应用程序时,使用python manage.py runserver命令,在环境变量PYTHONUNBUFFERED=1下工作正常。同时,print('helloworld', flush=True)也适用于我。

然而,python -u对我来说无法工作。


4

如果您没有使用 docker-compose,而只是普通的 docker,则可以将以下内容添加到托管 Flask 应用的 Dockerfile 中。

ARG FLASK_ENV="production"
ENV FLASK_ENV="${FLASK_ENV}" \
    PYTHONUNBUFFERED="true"

CMD [ "flask", "run" ]

1
通常我们会将其重定向到特定的文件(通过从主机挂载卷并将其写入该文件)。
使用 -t 添加 tty 也是可以的。你需要在docker日志中找到它。
使用大量日志输出时,我没有遇到将所有缓存存储在 docker 日志中的问题。

0
我使用带有Docker扩展的Visual Studio Code来自动创建Python的Dockerfile。
默认情况下,它会有这一行。
# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED=1

它在容器以分离模式运行时能正常工作并显示日志,所以我认为这是首选的方式。我使用的是Python 3.11。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接