Как прослушивать брэйкпоинты в тестах внутри контейнера?
Предисловие. Есть phpunit тесты внутри докер контейнера. Хочу прослушать брэйкпоинты в тестах внутри контейнера. Обычный дебаггер настроил и он работает как надо, но только с помощью расширения для браузера хром. Но когда проставляю брэйкпоинты в тестах в редакторе и запускаю тесты внутри контейнера, то они разумеются не прерывают выполнение в брэйкпоинтах, а консоль просто выплевывает на меня палитру из зеленых и красных тестов.
Найденные пути решения. Изрыл очень много всего и нашел очень скудный набор того, что можно сделать (хотя странно, ведь проблема вроде как на поверхности).
- Было найдено решение для phpstorm, а я использую vscode, хотя в том решении я тоже если честно не уверен. Ресурс был один, комментов к статье не было, статья была на английском вдруг что-то не то понял. Ссылка: https://www.linkedin.com/pulse/phpstorm-docker-phpunit-xdebug-hernan-arregoces
- Открывать контейнер непосредственно в редакторе и оттуда дебажить тесты. Звучит супер и вроде как просто, но vscode с подключенным расширением conteiner dev на любой контейнер выплёвывает ошибку:
Retrying to download VS Code Server. Error: XHR failed at v.onerror. Полный лог ошибки очень длинный и если надо, то прикреплю, но в целом косяк, как видно из этого куска, в ошибке установкиvs code serverиз проблем с подключением\проксей\случайности\звёзды не сошлись. Прокси\впн\дедики\бубны не использую. Ссылка: https://stackoverflow.com/questions/67888321/how-to-hit-vscode-breakpoints-in-unit-tests-from-within-a-docker-compose-setup-r#:~:text=If%20you've%20landed%20here,Then%20everything%20will%20just%20work. - Третье решение, но по нему тоже не особо много нашел, хотя в него и не верю: это установка chrome dev tools еще одним контейнером чтобы закидывать хромовский дебаггер вместе с тестами, но я без понятия как это будет работать и почему и есть ли вообще такой образ на докерхабе. Ссылки нет, т.к. это был коммент к какому-то посту, то ли видео, в общем не смог найти.
- Четвертое решение похожее на третье, но здесь вообще не понимаю, что происходит. Зачем создавать отдельный контейнер для дебаггинга? Ссылка: https://www.giulioprinaricotti.com/vscode-docker-phpunit-xdebug-setup/
Вопрос. Как мне дебажить тесты внутри докер контейнера? Какой способ из предложенных наиболее правильный? Лично я больше всего склоняюсь ко второму, но как исправить ошибки загрузки расширения тоже не знаю. (Гуглил, но нашел только один тред и там ругают прокси, который я не использую. Если надо, то ссылку на тред приложу.) Какие способы есть помимо предложенных?
Ресурсы. Dockerfile образа
FROM php:8.1.16-fpm
# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/
# Set working directory
WORKDIR /var/www
# Install dependencies
RUN apt-get update && apt-get install -y \
apt-utils \
libpq-dev \
libpng-dev \
libzip-dev \
zip unzip \
git && \
docker-php-ext-install pdo && \
docker-php-ext-install pdo_pgsql && \
docker-php-ext-install pgsql && \
docker-php-ext-install bcmath && \
docker-php-ext-install gd && \
docker-php-ext-install zip && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Install XDebug
RUN pecl install xdebug \
&& docker-php-ext-enable xdebug
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www
# Copy existing application directory contents
COPY . /var/www
# Copy existing application directory permissions
COPY --chown=www:www . /var/www
# Change current user to www
USER www
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
Кусок docker-compose.yaml с образом
...
backend:
build:
context: ./backend
dockerfile: _docker/app/Dockerfile
volumes:
- ./backend/:/var/www/
depends_on:
- db
user: "1000:1000"
environment:
XDEBUG_MODE: debug
XDEBUG_CONFIG: client_host=host.docker.internal client_port=9003
container_name: project_backend
networks:
- app-network
...
launch.json для встроенного дебаггера vscode
{
"version": "0.2.0",
"configurations": [
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003,
"pathMappings": {
"/var/www": "${workspaceFolder}/backend"
},
}
]
}