django - 使用 docker/fig 运行 Django 开发服务器时,为什么隐藏了一些日志输出?

标签 django shell exec docker fig

我正在编写一个 Dockerfile,它需要作为 CMD 指令的一部分运行多个命令,我认为正确的方法是运行一个 shell 脚本,主守护进程通过执行。不幸的是,作为该过程的一部分,我的一些输出(stdout?stderr?我不知道,也不知道如何找出)丢失了。

这是 shell 脚本:

#!/bin/sh

python manage.py migrate
exec python manage.py runserver 0.0.0.0:8000

这个想法是 migrate 命令只运行一次并显示其输出,然后 runserver 命令应该接管并且容器运行直到该进程退出。

实际问题是 migrate 的输出显示正确,但 runserver 的立即输出显示不出来。奇怪的是,runserver 的后续请求日志显示得很好。

为了澄清,这是我期望的输出:

[...]
No migrations to apply.
[...]
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
[21/Jan/2015 16:27:06] "GET / HTTP/1.1" 200 15829

这就是我用 fig up 得到的:

[...]
No migrations to apply.
[...]
[21/Jan/2015 16:27:06] "GET / HTTP/1.1" 200 15829

我什至不确定这是谁的错。 runserver 命令是否会根据运行方式更改其输出? exec 有问题吗?是docker/fig吗?

作为一个额外的数据点,我注意到在使用 fig run web 运行容器时我确实得到了所有输出,但在我使用 fig up 时却没有,但是我不明白这有何不同或相关性。

注意:很抱歉标签垃圾邮件,一旦我知道究竟是什么导致了这种影响,我会减少标签。

最佳答案

我今天使用 docker composer 发现了这个老问题。 Python 日志模块检查输出是否为终端,因此您需要将 tty: true 添加到服务中。示例:

version: '2'
services:
  django:
    tty: true
    command: python -u manage.py runserver 0.0.0.0:8080
    ports:
    - "8080:8080"

关于django - 使用 docker/fig 运行 Django 开发服务器时,为什么隐藏了一些日志输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28072259/

相关文章:

shell - 如何通过管道将主机名传送到 SSH 调用中?

php - 如何使用 cron 启动 exec() PHP 命令但没有运行其中的 2 个?

PHP exec : hangs, 不继续到下一行

mysql - AWS Lambda 在峰值期间淹没 RDS MySQL 连接

Django 模型根据查询字符串进行过滤

python - 在本地运行 "python manage.py syncdb"时出错,但通过 Heroku 运行相同命令时没有错误

python - 如何对 Django 模型对象的字母数字列表进行排序

linux - 如何使用 shell 在 linux 中逐一打印具有完整信息的所有用户列表

linux - 在 bash 终端窗口中显示当前目录名称

通过 execv() 调用 echo 打印额外字符