Search code examples
pythondockervisual-studio-coderemote-debugging

How to remote debug python code in a Docker Container with VS Code


I've just registered for this question. It's about if it's possible to remote debug python code in a Docker Container with VS Code. I am having a completely configured Docker Container here. I got a little bit of help with it, and I'm pretty new to docker anyways. In it runs Odoo v10. But I cant get the remote debug in VS Code to work. I have tried this explanation, but I don't really get it. Is it even possible? And if yes, how can I get it to work? I'm running Kubuntu 16.04 with VS Code 1.6.1 and the Python Extension from Don Jayamanne. Ah yeah and I hope I am at the right location with this question and it's not against any rules.

UPDATE:

Just tried the way of Elton Stoneman. With it I'm getting this error:

There was an error in starting the debug server. 
Error = {"code":"ECONNREFUSED","errno":"ECONNREFUSED","syscall":"connect",
         "address":"172.21.0.4","port":3000}

My Dockerfile looks like this:

FROM **cut_out**
USER root
# debug/dev settings

RUN pip install \
        watchdog

COPY workspace/pysrc /pysrc
RUN apt-get update \
 && apt-get install -y --no-install-recommends \
        build-essential \
        python-dev \
 && /usr/bin/python /pysrc/setup_cython.py build_ext --inplace \
 && rm -rf /var/lib/apt/lists/*

EXPOSE 3000

USER odoo

The pysrc in my Dockerfile is there because this was intended for working with PyDev (Eclipse) before.

This is the run command I've used:

docker-compose run -d -p 3000:3000 odoo

And this is the important part of my launch.json:

    {
        "name": "Attach (Remote Debug)",
        "type": "python",
        "request": "attach",
        "localRoot": "${workspaceRoot}",
        "remoteRoot": "${workspaceRoot}",
        "port": 3000,
        "secret": "my_secret",
        "host": "172.21.0.4"
    }

I hope that's enough information for now.

UPDATE 2:

Alright I found the solution. I totally misunderstood how Docker works and tried it completeley wrong. I already had a completeley configured Docker-compose. So everything I needed to do was to adapt my VS Code configs to the docker-compose.yml. This means that I just had to change the launch.json to the port 8069 (default Odoo port) and just need to use docker-compose up, then the debugging works in VS Code. Unfortunately the use of ptvsd kinda destroys my Odoo environment, but at least I'm able to debug now. Thanks!


Solution

  • Yes, this is possible - when the Python app is running in a Docker container, you can treat it like a remote machine.

    In your Docker image, you'll need to make the remote debugging port available (e.g. EXPOSE 3000 in the Dockerfile), include the ptvsd setup in your Python app, and then publish the port when you run the container, something like:

    docker run -d -p 3000:3000 my-image
    

    Then use docker inspect to get the IP address of the running container, and that's what you use for the host in the launch file.