在 MacOS 上使用容器调试 FastAPI 的 VSCode

3
我正在使用VS Code调试运行在容器中的FastAPI。当我启动调试器时,FastAPI应用程序在容器中运行。但是当我从主机访问网页时,服务器没有响应,如下图所示: enter image description here 然而,如果我使用以下命令从命令行启动容器,则可以从主机访问网页:
docker run -p 8001:80/tcp with-batch:v2 uvicorn main:app --host 0.0.0.0 --port 80
这是tasks.json文件:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
    {
        "type": "docker-run",
        "label": "docker-run: debug",
        "dockerRun": {
            "image": "with-batch:v2",                
            "volumes": [
                {
                    "containerPath": "/app",
                    "localPath": "${workspaceFolder}/app"
                }
            ],
            "ports": [
                {
                    "containerPort": 80,
                    "hostPort": 8001,
                    "protocol": "tcp"
                }
            ]
        },
        "python": {
            "args": [
                "main:app",
                "--port",
                "80"
            ],
            "module": "uvicorn"
        }
    },
    {
        "type": "docker-build",
        "label": "docker-build",
        "platform": "python",
        "dockerBuild": {
            "tag": "with-batch:v2"
        }
    }
]

这是 launch.json 文件:

{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
    {
        "name": "Debug Flask App",
        "type": "docker",
        "request": "launch",
  
        "preLaunchTask": "docker-run: debug",
        "python": {
          "pathMappings": [
            {
              "localRoot": "${workspaceFolder}/app",
              "remoteRoot": "/app"
            }
          ],
          "projectType": "fastapi"
        }
      }
]

以下是调试控制台输出结果: 在这里输入图片描述

以下是Docker运行时的调试终端输出结果: 在这里输入图片描述

以下是Python Debug Console的终端输出结果: 在这里输入图片描述

1个回答

0

解释

你无法通过该端口访问容器的原因是,VSCode会使用一个随机的、唯一的本地主机端口映射到正在运行的容器。

您可以通过运行docker container inspect {container_name}来查看这一点,它应该会打印出运行容器的JSON表示形式。在您的情况下,您将编写docker container inspect withbatch-dev

JSON是对象数组,在这种情况下只有一个对象,具有"NetworkSettings"键和该对象中的一个键"Ports",它看起来类似于:

"Ports": {
    "80/tcp": [
        {
            "HostIp": "0.0.0.0",
            "HostPort": "55016"
        }
    ]
}

那个端口55016是您可以在localhost:55016连接的端口

解决方案

通过一些调整和文档,似乎"projectType": "fastapi"应该在那个特定端口为您启动浏览器。此外,您的调试控制台输出显示Uvicorn running on http://127.0.0.1:80。127.0.0.1是本地主机(也称为环回接口),这意味着Docker容器中的进程仅侦听内部连接。将Docker容器视为相对于计算机的自己的子网络(当然有例外,但这不重要)。如果它们想要监听外部连接(您的计算机或其他容器),则需要告诉容器的虚拟网络接口这样做。在服务器的上下文中,您将使用地址0.0.0.0来指示您要监听引用此接口的所有ipv4地址。

这有点深奥,但可以简单地说,您应该能够将--host 0.0.0.0添加到运行参数中,并且您将能够连接。您可以将其添加到tasks.json中的docker-run对象中,在其中指定其他Python参数:

    {
        "type": "docker-run",
        "label": "docker-run: debug",
        "dockerRun": {
            "image": "with-batch:v2",                
            "volumes": [
                {
                    "containerPath": "/app",
                    "localPath": "${workspaceFolder}/app"
                }
            ],
            "ports": [
                {
                    "containerPort": 80,
                    "hostPort": 8001,
                    "protocol": "tcp"
                }
            ]
        },
        "python": {
            "args": [
                "main:app",
                "--host",
                "0.0.0.0",
                "--port",
                "80"
            ],
            "module": "uvicorn"
        }
    },

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接