'xdebug 3 not working in ubuntu 20.04 with docker

I'm trying to use xdebug 3 with docker on ubuntu 20.04, but I'm not getting success, xdebug does not enter the interruption point, I already searched for everything and no answer solved my problem, it would be something about the docker host, because the same configuration is the right one in windows, I don't know what else I can try to solve the problem, I would like a help to understand what I'm doing wrong, below is my configuration.

My docker-compose file

version: '3.7'

networks:
  supervisao:

services:
  nginx:
    image: nginx:stable-alpine
    container_name: supervisao-web
    ports:
      - "80:80"
    volumes:
      - .:/var/www/html/
      - ./.docker/web/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
      - mysql
    networks:
      - supervisao
  mysql:
    image: mysql:latest
    container_name: supervisao-db
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    tty: true
    ports:
      - "3306:3306"
    volumes:
      - ./.docker/mysql/:/var/lib/mysql
    environment:
      MYSQL_DATABASE: supervisao
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
      MYSQL_ROOT_PASSWORD: pass
      SERVICES_TAGS: dev
      SERVICES_NAME: mysql
    networks:
      - supervisao
  php:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: supervisao-php
    volumes:
      - .:/var/www/html/
      - ./.docker/php/docker-xdebug.ini:/usr/local/etc/php/conf.d/php-docker.ini
    ports:
      - "9000:9000"
    networks:
     - supervisao
  redis:
    image: redis:latest
    volumes:
      - ./.docker/redis:/data
    ports:
      - 6379:6379
    networks:
      - supervisao

my xdebug.ini

# File: docker-xdebug.ini
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so
xdebug.discover_client_host=1
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_host = host.docker.internal
xdebug.client_port = 9003
xdebug.log = /var/www/html/xdebug.log

I appreciate if someone can collaborate, thank you



Solution 1:[1]

Make sure you have xdebug 3 loaded in PHP. Create the phpinfo.php file

<?php
    phpinfo();

Surf to it to check that xdebug is loaded by PHP and is version 3.

If the xdebug is version 2.x then you can install v3 with pecl instead. If you have shell access to your docker box you can try the pecl command directly and see in phpinfo if you got xdebug v3.

In your DockerFile:

# PECL
RUN mkdir -p /tmp/pear/cache
RUN pecl channel-update pecl.php.net
RUN apt install -y php-pear

COPY xdebug.ini "/etc/php/${PHP_VERSION}/mods-available/xdebug.ini"
# The xdebug distributed with Ubuntu 20.04 LTS is v2.9.2, we want v3.0.x
RUN pecl install xdebug
# Enable xdebug by default
RUN phpenmod xdebug
 

In your xdebug.ini

zend_extension=xdebug.so
xdebug.default_enable = On
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.discover_client_host=yes
xdebug.max_nesting_level = -1
xdebug.log = "/var/www/log/xdebug.log"
xdebug.output_dir = "/var/www/log/profiler" 

Now you could rebuild the docker boxes

docker stop  
docker build --no-cache
docker up

Check in phpinfo if you got the settings enabled.

If you have shell access to your docker box you can look at the log file.

tail -n 100 /var/www/log/xdebug.log

If you run PHP Storm there is an excellent validator in PHP Storm >> File >> Settings >> Languages & Frameworks >> PHP >> Debug Click the link "Validate". Set local web server path to your public folder. Validation script to your webb address. Works good on shared folders and not so good on synced folders.

If you run Ubuntu as host then look at the firewall settings. "9000/tcp ALLOW IN Anywhere" and the same for port 9003. Or try temprarily to disable the firewall.

I also added port 9003:9003 to the DockerFile. But have not tested if that makes any difference.

Hope any of this was of help to you.

Solution 2:[2]

In my case, disabling firewall did the trick - sudo ufw disable

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 avrahamm