【问题标题】:VS Code run and debug Python in Docker using docker-composeVS Code 使用 docker-compose 在 Docker 中运行和调试 Python
【发布时间】:2020-07-09 20:22:35
【问题描述】:

为易于使用的环境配置 VS Code。我想有一种简单的方法在 Docker 中启动 Python 脚本并附加调试器。

我有什么好工作的:

  1. 已创建 Dockerfile 和 docker-compose.yaml 以正确运行 docker-compose up|start
  2. 我能够附加到 running docker 容器并调试我的代码。

我想得到什么?

一个按钮即可启动和附加。

我需要使用 docker-compose 启动应用程序。我不想在 VS Code 中配置 docker-run 任务。

我的代码和想法:

Dockerfile:

FROM python:3.6-alpine
RUN mkdir -p /work/
WORKDIR /work/
COPY ./python/requirements.txt ./requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
COPY ./python/src/ .
CMD python -m ptvsd --host 0.0.0.0 --port 5678 --wait run.py < tests/input.txt > tests/output.txt

docker-compose.yaml

version: "3.7"
services:
    py-service:
        container_name: py-container
        image: py-image
        build:
            context: ./
        volumes:
            - ./python/src/:/work
        ports:
            - 5678:5678

launch.json 配置:

   { // simple attach to running container - works good
        "name": "Python Attach",
        "type": "python",
        "request": "attach",
        "pathMappings": [
            {
                "localRoot": "${workspaceFolder}/python/src/",
                "remoteRoot": "/work/"
            }
        ],
        "port": 5678,
        "host": "127.0.0.1"
    },
    { // launch docker container and attach to debugger - NOT works
        "name": "Run Py in Docker",
        "type": "docker",
        "request": "launch",
        "platform": "python",
        "preLaunchTask": "docker-compose-start",
        "python": {
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}/python/src/",
                    "remoteRoot": "/work/"
                }
            ],
            "projectType": "general",
            "host": "127.0.0.1",
            "port": 5678,
        },
    },

tasks.json 运行 docker-compose 命令

{
  "label": "docker-compose-start",
  "type": "shell",
  "command": "docker-compose up"
},

问题是 Run Py in Docker 的执行正常启动了我的容器,但无法附加调试器并且超时失败。当容器仍在运行并等待附加时。可以通过某种方式解决这个问题吗?

更新

终于可以启动和调试了!这是我的task.json

{
  "label": "docker-compose-start",
  "type": "shell",
  "command": "docker-compose up --build -d",
  "isBackground": true,
  "problemMatcher": [
    {
      "pattern": [{ "regexp": ".", "file": 1, "location": 2, "message": 3, }],
      "background": {
        "activeOnStart": true,
        "beginsPattern": "^(Building py-service)$",
        "endsPattern": "^(Creating|Recreating|Starting) (py-container) ... (done)$",
      }
    },
  ],
},

launch.json

{
    "name": "run py",
    "type": "python",
    "request": "attach",
    "preLaunchTask": "docker-compose-start",
    "pathMappings": [
        {
            "localRoot": "${workspaceFolder}/python/src/",
            "remoteRoot": "/work/"
        }
    ],
    "port": 5678,
    "host": "127.0.0.1"
},

毕竟,将所有 docker up|build 输出显示到问题中给我带来了不便。 VS Code 每次都要求继续,但 Enter 有帮助。

【问题讨论】:

    标签: visual-studio-code launch


    【解决方案1】:

    docker-compose up 是一个前台开始(stdin 捕获、stdout 打印...和等待退出的命令/信号

    对于你的情况,更适合的是后台启动(`docker compose up -d',参见d(detached) flag)。此命令启动容器并将控制权交给下一个命令(附加)。

    更新:

    如果后台运行没有帮助,请尝试在后台运行 this solution

    【讨论】:

    • 感谢您的想法。我尝试了不同的启动方式,包括 -ddocker-compose up --no-start && docker-compose start... 看起来 vscode 需要一些退出代码完成 preLaunchTask。
    • 所有程序都返回一些代码。 0 表示正常执行,正表示错误。查看第一个答案更新
    • 终于我能够启动和附加调试器了...谢谢你尼克!只发现了一个不便之处:来自 docker build 的所有消息都进入 Problems 并且出现 VS Code 消息“仍然继续”。按 Enter 会有所帮助。我会用新的配置更新我的问题。
    • 重启后我有了一个新的行为: 1. 没有显示任何问题。 2.第一次调试没有任何消息是无法运行的。 3.第二次调试器连接正确。
    • 也许“问题”仅由 stderr 输出触发。您可以尝试重定向输出: docker-compose up --build -d 2> /dev/null (可能stdout可以> /dev/null,但我担心在这种情况下应该重写该模式,因为没有行会出现)。附言如果有足够的帮助,请不要忘记将答案标记为正确。
    猜你喜欢
    • 2020-09-30
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2018-06-07
    • 2019-06-18
    • 1970-01-01
    相关资源
    最近更新 更多