我有一个 flask 应用程序,我正在这样运行:flask run --host=0.0.0.0
当我查看流程列表时,会看到以下内容:
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 23:48 pts/0 00:00:00 /bin/sh -c flask run --host=0.0.0.0
root 6 1 1 23:48 pts/0 00:00:01 /usr/local/bin/python /usr/local/bin/flask run --host=0.0.0.0
root 8 6 3 23:48 pts/0 00:00:02 /usr/local/bin/python /usr/local/bin/flask run --host=0.0.0.0
三个过程。
如果我使用
--without-threads
运行,我还将执行以下三个过程:UID PID PPID C STIME TTY TIME CMD
root 1 0 0 00:28 pts/0 00:00:00 /bin/sh -c flask run --host=0.0.0.0 --without-threads
root 6 1 2 00:28 pts/0 00:00:02 /usr/local/bin/python /usr/local/bin/flask run --host=0.0.0.0 --without-threads
root 8 6 4 00:28 pts/0 00:00:04 /usr/local/bin/python /usr/local/bin/flask run --host=0.0.0.0 --without-threads
有没有办法以某种方式将 flask 作为一个单独的过程运行?
动机
有问题的 flask 应用程序正在docker容器中运行。我希望能够使用
ipdb
设置断点。我观察到,如果我在docker-compose文件中设置了此设置:
stdin_open: true
tty: true
然后运行一个简单的单进程python应用程序,而不是flask应用程序。
$ docker exec -it bug_demo_bug_demo_1 bash
root@98245482089b:/opt/bug_demo/bug_demo# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 00:41 pts/0 00:00:00 /bin/sh -c python app.py
root 7 1 20 00:41 pts/0 00:00:00 python app.py
...并在应用程序处于断点时附加到容器,我可以放入
ibpd
并正常使用它-箭头键和制表符完成正常工作。但是,当我尝试对flask应用程序执行相同操作(将应用程序在断点处等待时,将其附加到容器上)时,事情将无法正常进行。
我要么禁用了
tty: true
中的docker-compose.yml
,并且可以使用ipdb
但没有箭头键和制表符完成,或者我保留了tty: true
,但是根本无法真正使用ipdb
,b/c似乎tty
已附加到所有三个 flask 过程中,导致除单字符命令以外的所有内容都出现乱码。 (尽管我可以通过此设置看到箭头键和制表符完成功能。)所有这些使我相信,如果我能找到一种方法来作为一个单独的程序来运行我的flask应用程序,那么我将能够附加到docker容器并根据需要使用
ipdb
。有什么办法可以做到这一点?
更新:问题在启动期间而不是在请求处理期间出现
经过进一步检查,我发现此问题仅在“启动”代码期间出现。例如:如果断点在ojit_code函数内部。
如果断点位于请求处理程序方法或从请求处理程序中调用的代码内,则所有操作均按预期进行。
使用
create_app
可以将进程数从三个减少到两个(第一个工作进程替换了根进程),但是问题仍然存在于exec
内部的断点。使用
create_app
运行flask会使第二个工作人员离开,因此可以通过不使用或使用--no-reload
将进程计数强制为一或两个。对于我的用例,使用exec
运行不是理想的选择,但是即使对于--no-reload
中的断点,它也确实使问题消失了。就我的目的而言,我可以忍受
create_app
的局限性,即只能与请求处理程序中的终端配合使用-我不希望从启动代码运行调试器。 (但是,如果任何人都可以准确地解释启动代码断点情况下发生的事情,以及为什么问题没有出现在请求处理程序断点情况下,那么我仍然会接受悬赏并高兴地给予悬赏。)基于
ipdb
的发现,确实感觉到潜在的脆弱性与请求处理过程和代码重载过程“共享”了TTY。Flask和Docker版本信息
ipdb> flask.__version__
'1.0.3'
$ docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:39 2019
OS/Arch: darwin/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: false
$ docker info
Containers: 22
Running: 3
Paused: 0
Stopped: 19
Images: 362
Server Version: 18.09.2
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9754871865f7fe2f4e74d43e2fc7ccd237edcbce
runc version: 09c8266bf2fcf9519a651b04ae54c967b9ab86ec
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 4.9.125-linuxkit
Operating System: Docker for Mac
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.855GiB
Name: linuxkit-025000000001
ID: ZAK2:V2VU:IZFF:6MQQ:IFJB:2ZKY:VHA5:CSO3:VXQQ:UK6C:O3I7:S3ZU
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
File Descriptors: 59
Goroutines: 89
System Time: 2019-07-28T14:00:38.3184372Z
EventsListeners: 2
HTTP Proxy: gateway.docker.internal:3128
HTTPS Proxy: gateway.docker.internal:3129
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
$ docker-compose --version
docker-compose version 1.23.2, build 1110ad01
最佳答案
要使 flask 在单个处理器中运行,请使用以下内容
if __name__ == '__main__':
app.run(threaded=False, processes=1)
关于python - 是否可以在单个过程中运行 flask ? (以解决ipdb和Docker ttys的明显问题),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57211937/