我有一个 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

有什么办法可以做到这一点?

更新:问题在启动期间而不是在请求处理期间出现

经过进一步检查,我发现此问题仅在“启动”代码期间出现。例如:如果断点在o​​jit_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/

10-16 10:22