【问题标题】:vscode debug FastAPI in container on MacOSvscode 在 MacOS 上的容器中调试 FastAPI
【发布时间】:2023-03-20 03:24:01
【问题描述】:

我正在使用 VS Code 设置在容器中运行的 FastAPI 的调试。当我启动调试器时,FastAPI 应用程序在容器中运行。但是当我从主机访问网页时,服务器没有响应如下:

但是,如果我从命令行使用以下命令启动容器,我可以从主机访问网页。

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-run: 调试终端输出:

这里是 Python 调试控制台终端输出:

【问题讨论】:

    标签: docker debugging visual-studio-code


    【解决方案1】:

    说明

    您无法在该端口访问容器的原因是,VSCode 使用映射到正在运行的容器的随机、唯一 localhost 端口构建您的映像。

    您可以通过运行 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 上连接的端口

    解决方案

    经过一些修改和documentation"projectType": "fastapi" 似乎应该在该特定端口为您启动浏览器。此外,您的调试控制台输出显示Uvicorn running on http://127.0.0.1:80。 127.0.0.1 是 localhost(也称为环回接口),这意味着你在 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"
            }
        },
    

    【讨论】:

      猜你喜欢
      • 2020-05-28
      • 1970-01-01
      • 2021-04-24
      • 2020-10-12
      • 1970-01-01
      • 2023-01-16
      • 2021-07-20
      • 2020-02-24
      • 2021-06-02
      相关资源
      最近更新 更多