Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我如何理解在Docker中使用Flask记录入口点_Python_Docker_Flask_Gunicorn - Fatal编程技术网

Python 我如何理解在Docker中使用Flask记录入口点

Python 我如何理解在Docker中使用Flask记录入口点,python,docker,flask,gunicorn,Python,Docker,Flask,Gunicorn,我的Docker容器运行gunicorn,它指向“myapp.py”,它正在使用烧瓶 cat Dockerfile: FROM python:3.7 <snip no important> USER nobody ENTRYPOINT ["/usr/sbin/flask-docker-entrypoint.sh"] EXPOSE 8000 一切都很好 Docker守护程序日志记录设置为“json/file”。我告诉gunicorn日志到标准输出(默认为20版)。我可以使用简单

我的Docker容器运行gunicorn,它指向“myapp.py”,它正在使用烧瓶

cat Dockerfile:

FROM python:3.7

<snip no important>

USER nobody
ENTRYPOINT ["/usr/sbin/flask-docker-entrypoint.sh"]
EXPOSE 8000
一切都很好

Docker守护程序日志记录设置为“json/file”。我告诉gunicorn日志到标准输出(默认为20版)。我可以使用简单的日志语句将日志从myapp.py发送到“docker日志”。为什么会这样

ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
nobody       1     0  0 22:01 ?        00:00:00 /bin/bash /usr/sbin/flask-docker-entrypoint.sh
nobody      12     1  0 22:01 ?        00:00:00 /usr/local/bin/python /usr/local/bin/gunicorn myapp:app -c /external/
nobody      15    12  0 22:01 ?        00:00:00 /usr/local/bin/python /usr/local/bin/gunicorn myapp:app  -c /external/
nobody      57     0  7 22:44 pts/0    00:00:00 bash
nobody      62    57  0 22:44 pts/0    00:00:00 ps -e
flask-docker-entrypoint.sh为pid 1,以便记录到标准输出。明白了。使用entrypoint的pid的所有子级是否也继承了登录到标准输出的能力?看起来gunicorn不是pid 1,myapp.py不是pid 1,但两者都登录到标准输出


谢谢您

在类Unix环境中,进程的默认行为是继承其父进程的stdout(以及stdin和stderr)。您可以很容易地在本地shell中演示这一点:

#/垃圾箱/垃圾箱
#这是脚本1
/脚本2
#/垃圾箱/垃圾箱
#这是脚本2
你好
$。/script1
你好
$./script1>日志
$cat日志
你好
在上一个示例中,如果
script1
的输出转到控制台或重定向到日志文件,则当它作为子进程运行
script2
时,它将继承相同的标准输出

之所以
gunicorn
不是pid 1,是因为您有一个shell包装器。您可以使用shell内置程序将shell进程替换为它想要运行的东西

#/垃圾箱/垃圾箱
exec/usr/local/bin/gunicorn myapp:app-c/local/gunicorn.conf.py
除非您需要进行更多的设置,否则直接将命令放入Dockerfile可能会更简单。(
CMD
更容易在运行时重写,以便在需要时执行诸如获取调试shell之类的操作;这将替换现有的
ENTRYPOINT
行。)

CMD[“gunicorn”、“myapp:app”、“-c”、“/local/gunicorn.conf.py”]

非常感谢David san。为什么myappy.py会写入docker日志?这不是一个过程。是不是因为gunicorn“钩住”了它,现在它“在”gunicorn里面?
ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
nobody       1     0  0 22:01 ?        00:00:00 /bin/bash /usr/sbin/flask-docker-entrypoint.sh
nobody      12     1  0 22:01 ?        00:00:00 /usr/local/bin/python /usr/local/bin/gunicorn myapp:app -c /external/
nobody      15    12  0 22:01 ?        00:00:00 /usr/local/bin/python /usr/local/bin/gunicorn myapp:app  -c /external/
nobody      57     0  7 22:44 pts/0    00:00:00 bash
nobody      62    57  0 22:44 pts/0    00:00:00 ps -e