DEV Community

Xdebug in VSCode with Docker

Jack Miras on December 10, 2021

In my last post, I talked about how to configure a development environment and how it extends a Dockerfile made for production. Now, I would like ...
Collapse
 
apmyp1990 profile image
apmyp1990

Hi, thanks for the guide. I am using VSCode from WSL2 with Docker installed in WSL2. But this setup will not work for me.
Do you have any suggestsions?

Thanks in advance

Collapse
 
jackmiras profile image
Jack Miras

Hi @apmyp1990, what problems are you facing?

Do you have any logs that you can share?

Collapse
 
apmyp1990 profile image
apmyp1990

I solved the problem - this line was missing:

xdebug.discover_client_host=true
Enter fullscreen mode Exit fullscreen mode
Thread Thread
 
luksladky profile image
Lukáš Sladký

Kudos for posting the answer to your problem after you'd solved it.

Thread Thread
 
apmyp1990 profile image
apmyp1990

A few days I ago I had to sovle the same problem again, because I hat to re-setup my local develpment. I was really happy to find my old setup here :-D

Thread Thread
 
tkorakas profile image
Thanos Korakas • Edited

On Windows with WSL2 and Docker I had to add the "hostname" property to the launch.json with the value "0.0.0.0".
"hostname": "0.0.0.0"
Also, I didn't have to specify my IP address on the xdebug.ini host field. I used the host.docker.internal, xdebug.client_host='host.docker.internal' and xdebug.discover_client_host=0

Thanks a lot for your great article

Thread Thread
 
jackmiras profile image
Jack Miras

@tkorakas how are you doing?

Thanks for adding the notes, I really appreciate it!

I just would like to leave it an observation about setting xdebug.client_host=host.docker.internal... Last time I've checked this didn't work for all OS (Linux, Mac, and Windows) while setting the IP works for the three of them.

For anyone else reading this comment, if your OS works by setting the client host this way, I recommend that you do it because it will save you from having to update your IP address from time to time.

Also, you probably had to set "hostname": "0.0.0.0" because of the change at the xdebug.client_host but it's not a big change.

Once again, thanks for adding the notes.

Thread Thread
 
tkorakas profile image
Thanos Korakas

Your comments makes absolute sense and it might save a lot of time from people reading this article.

Linux users where host.docker.internal is not working could try to add this lines on their docker compose file

extra_hosts:
- "host.docker.internal:host-gateway"
Enter fullscreen mode Exit fullscreen mode

On the fpm container. Note: I didn't have the chance to test it

The main reason I used host.docker.internal is to be able to use this one different machines without having to change anything, or sharing with others.

Again, thanks a lot for your article. It was one the best written that I found on this topic

Collapse
 
apmyp1990 profile image
apmyp1990

I tried to tell my xdebug (in docker) the ip of my Windows Host hardcoded and via host copied from wsl to docker (that worked for another case), but the breakpoints were never hit.
Unfortunately I do not have any logs.

Here's my setup:


xdebug.ini

zend_extension=xdebug.so

xdebug.mode=debug,develop
xdebug.client_host=172.28.32.1
#same port as in launch.json
xdebug.client_port=9003
xdebug.idekey=VSCODE
xdebug.start_with_request=yes

launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug on Docker",
            "type": "php",
            "request": "launch",
            "port": 9003,
            "pathMappings": {
                "/amadeus360": "${workspaceFolder}"
            },
        },
    ]
}
Enter fullscreen mode Exit fullscreen mode
Collapse
 
snakepy profile image
Fabio

Hey really appreciated this guide, it helped me a lot to create my favorite dev env for laravel. I wrote about it here dev.to/snakepy/my-favorite-laravel...

I'd appreciate any improvement suggestions.

Collapse
 
kaustab profile image
Kaustab • Edited

Firstly thanks for the post and also the helpful comment. I also faced similar issue where I created a drupal site with docker and using docker desktop in windows wsl.

This is what worked for me.

xdebug.ini
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.discover_client_host=true
xdebug.client_host=192.168.65.2
xdebug.output_dir=/tmp/xdebug
xdebug.log=/tmp/xdebug/xdebug-drupalapp.log
xdebug.idekey=docker

NOTE: where 192.168.65.2 is the host.docker.internal IP. For me the hostname didn't work, but by adding the IP directly worked. I've checked the IP from "/etc/hosts" file inside my docker container.

Updated my launch.json file inside vscode.

"configurations": ....
...
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003,
"hostname": "0.0.0.0",
"log": true,
"pathMappings": {
"/opt/drupal": "${workspaceFolder}/drupal-app"
},
},

Start the debugging by clicking RUN&DEBUG or crlt+shift+D.

check the site with adding query parameter XDEBUG_SESSION_START=docker
where 'docker' is same as xdebug.idekey inside xdebug.ini
like:

http://drupalapp.localhost/blogs?XDEBUG_SESSION_START=docker

It worked !!

Collapse
 
kcndev profile image
Kachin Developer • Edited
{
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 0,
            "runtimeArgs": [
                "-dxdebug.start_with_request=yes"
            ],
            "env": {
                "XDEBUG_MODE": "debug,develop",
                "XDEBUG_CONFIG": "client_port=${port}"
            }
        }
Enter fullscreen mode Exit fullscreen mode

I want to run with docker container inside php how to setup

Collapse
 
egordemeshko profile image
Egor Demeshko

thx. one thing to mentions, mayby useful
i use linux, and on another guide a added
extra_hosts:
- host.docker.internal:host-gateway
to my docker-compose file.
eveything started working as you described only after deleting this options.

and one more clarification
"pathMappings": {
"/app/": "${workspaceFolder}/symfony/"
},

left side(key) is route to app folder inside container, and righthand route to files on my machine, where IDE is opened.

Collapse
 
razielrodrigues profile image
Raziel Rodrigues

thanks!