在Raspberry Pi 2上,我使用图像resin/rpi-raspbian:stretch
来运行Django应用程序。在我的Dockerfile中,我安装了python3
包并使用ENTRYPOINT python3 manage.py runserver 0:8000
启动应用程序。这可行,但是当我的代码抛出错误时,我使用docker log
命令得到NO输出。
我有一个ImportError。当我使用docker exec
手动运行命令时,我得到了预期的异常:
pi@pi2:/etc/docker/container/pms $ sudo docker exec -it pms_app_1 python3 manage.py runserver 0:8000
Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x75de3228>
[...]
ImportError: No module named 'ws4redisfrontend'
但是当我使用docker-compose
运行容器然后打开日志时,它们是空的:
pi@pi2:/myapp $ sudo docker logs myapp_1
pi@pi2:/myapp $
此行为仅适用于manage.py
调用。例如,当我像这样扩展入口点时:
ENTRYPOINT python3 -c "print('printed by python inline script')" && python3 manage.py runserver 0:8000
我看到在容器日志中用python内联脚本打印。作为Python / Django的新手,我无法理解为什么会这样。但是,正如我的打印示例有效,它似乎是一个Django问题,并没有Python的一般问题。我错过了什么?调试模式在settings.py
中激活。
docker logs
默认显示I / O流STDOUT和STDERR。检查Django logging中的settings.py
是否配置正确。
例如:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler'
},
},
'loggers': {
'': { # 'catch all' loggers by referencing it with the empty string
'handlers': ['console'],
'level': 'DEBUG',
},
},
}
另外值得一提的是:
在Django 1.10中更改:
在旧版本中,日志消息被写入sys.stderr而不是通过Python日志记录处理。
https://docs.djangoproject.com/en/1.11/ref/django-admin/#runserver
我不确定这是否与我正在努力解决的问题相同,但在我的情况下,我无法使用docker-compose在我的docker控制台中看到任何来自Django的错误信息。例如,如果我的任何进口产品都有拼写错误,它就不会显示任何东西,我的容器就不会起来。
帮助我的是this thread的答案,在我的docker-compose文件中添加'tty:true'后,它得到了修复。现在我可以看到所有错误以及常规打印。
希望它会帮助别人。