是否可以在单个过程中运行烧瓶?(以解决ipdb和Docker ttys的明显问题)

bil*_*llc 11 python flask docker

我有一个烧瓶应用程序,我正在像这样运行:

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
Run Code Online (Sandbox Code Playgroud)

三个过程。

如果我使用的--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
Run Code Online (Sandbox Code Playgroud)

有没有办法以某种方式将烧瓶运行为单个过程?

动机

有问题的烧瓶应用程序正在docker容器中运行。我希望能够使用设置断点ipdb

我观察到,如果我在docker-compose文件中设置了此设置:

    stdin_open: true
    tty: true
Run Code Online (Sandbox Code Playgroud)

然后运行一个简单的单进程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
Run Code Online (Sandbox Code Playgroud)

...并在应用程序处于断点时将其连接到容器,我可以ibpd正常使用它-箭头键和制表符完成正常工作。

但是,当我尝试对flask应用程序执行相同操作(将应用程序在断点处等待时,将其附加到容器上)时,事情将无法正常进行。

我要么tty: true在中禁用docker-compose.yml,要么可以使用ipdb但没有箭头键和制表符补全,或者我留tty: true在原地,但随后根本无法真正使用ipdb,因为b / c似乎与tty所有三个烧瓶过程都相关,导致除单个以外的所有事情字符命令变得乱码。(尽管我可以通过此设置看到箭头键和制表符完成功能。)

所有这些使我相信,如果我能找到一种方法来作为一个单独的程序来运行我的flask应用程序,那么我将能够连接到docker容器并按需使用ipdb

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

更新:问题在启动过程中出现,而不是在请求处理过程中出现

经过进一步检查,我发现此问题仅在“启动”代码期间出现。例如:如果断点在create_app函数内部。

如果断点位于请求处理程序方法或从请求处理程序中调用的代码内,则所有操作均按预期进行。

使用exec将进程数从三个减少到两个(第一个工作进程替换了根进程),但是内部的断点仍然存在问题create_app

运行带有的烧瓶--no-reload会使第二个工作人员离开,因此可以通过不使用或使用,将过程计数强制为一或两个exec--no-reload在我的用例中运行并不是一个理想的选择,但即使对于中的断点,它也确实使问题消失了create_app

就我的目的而言,我可以忍受ipdb只在请求处理程序内部与终端配合使用的局限性-我不希望从启动代码中运行调试器。(但是,如果任何人都可以准确地解释启动代码断点情况下发生的事情,以及为什么问题没有出现在请求处理程序断点情况下,我仍然会接受悬赏并高兴地给予悬赏。)

基于这一--no-reload发现,确实感觉到潜在的脆弱性与请求处理过程和代码重载过程“共享”了TTY。

Flask和Docker版本信息

ipdb> flask.__version__
'1.0.3'
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)
$ docker-compose --version
docker-compose version 1.23.2, build 1110ad01
Run Code Online (Sandbox Code Playgroud)

Căt*_*ilă 0

使用 Flask 应用程序可在单个同步进程上运行。

一次只能处理一个请求。

如果你想处理任何并行请求,应该等到它们可以处理后再使用:

app.run(host=HOST, port=PORT, threaded=True)
Run Code Online (Sandbox Code Playgroud)