#django #docker #visual-studio-code #docker-compose #vscode-debugger
#django #docker #visual-studio-code #docker-compose #vscode-отладчик
Вопрос:
Недавно я начал использовать docker для своего проекта, работающего со следующим
- Django
- Nginx
- Gunicorn
- Сельдерей
- Postgres
- Redis
Раньше было легко настроить отладчик, но после использования docker-compose я не могу этого сделать. Как только я запускаю отладчик, он загружается на некоторое время, а затем автоматически останавливается без каких-либо журналов или ошибок. Вот соответствующий код.
запустите файл .json
{
"configurations": [
{
"name": "Python: Remote Attach",
"type": "python",
"request": "attach",
"connect": {
"host": "localhost",
"port": 443
},
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "."
}
]
}
]
}
docker-compose.yml
version: '3'
services:
db:
image: postgres:12
env_file: .env
environment:
- POSTGRES_DB=${DB_NAME}
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
ports:
- "5431:5432"
volumes:
- dbdata:/var/lib/postgresql/data
nginx:
image: nginx:1.14
ports:
- "443:443"
- "80:80"
volumes:
- ./config/nginx/:/etc/nginx/conf.d
- ./myapp/static:/var/www/myapp.me/static/
web:
restart: always
build: ./myapp
command: bash -c "
python manage.py collectstatic --noinput
amp;amp; python manage.py makemigrations
amp;amp; python manage.py migrate
amp;amp; gunicorn --certfile=/etc/certs/localhost.crt --keyfile=/etc/certs/localhost.key myapp.wsgi:application --bind 0.0.0.0:443 --reload"
expose:
- "443"
depends_on:
- db
- nginx
env_file:
- .env
volumes:
- ./myapp:/opt/myapp
- ./config/nginx/certs/:/etc/certs
- ./myapp/static:/var/www/myapp.me/static/
broker:
image: redis:alpine
expose:
- "6379"
celery:
build: ./myapp
command: celery -A myapp worker -l info
env_file:
- .env
volumes:
- ./myapp:/opt/myapp
depends_on:
- broker
- db
celery-beat:
build: ./myapp
command: celery -A myapp beat -l info
env_file:
- .env
volumes:
- ./myapp:/opt/myapp
depends_on:
- broker
- db
volumes:
dbdata:
Ответ №1:
Наконец мне удалось решить это самостоятельно. Несколько выводов из проблемы.
Вам нужно использовать debugpy и поместить его в свой manage.py файл, чтобы начать прослушивание порта. Я сделал что-то вроде этого
import debugpy
debugpy.listen(('0.0.0.0', 5678))
debugpy.wait_for_client()
debugpy.breakpoint()
Наряду с этим нам нужно сопоставить этот порт с портом внутри хост-машины. Для этого нам нужно изменить и добавить одну строку в веб-службу docker-compose
ports:
- "5678:5678"
И мой launch.json выглядит так
{
"configurations": [
{
"name": "Python: Remote Attach",
"type": "python",
"request": "attach",
"connect": {
"host": "0.0.0.0",
"port": 5678
},
"pathMappings": [
{
"localRoot": "${workspaceFolder}/myapp",
"remoteRoot": "."
}
]
}
]
}
ПРИМЕЧАНИЕ: убедитесь, что в вашем файле требований есть debugpy, или установите его вручную.
Комментарии:
1. Спасибо за эту большую помощь, которую вы мне оказали! Я часами пытался получить какую-то рабочую конфигурацию, и ваша просто работает как шарм!
2. Вы только что сохранили мои
Ответ №2:
Если вы сделаете свой отладчик модулем, вы можете включать и выключать его с помощью переменной среды. Я просто использовал эту статью в качестве основы для решения отладки fastapi / gunicorn.
# debugger.py
from os import getenv
def initialize_flask_server_debugger_if_needed():
if getenv("DEBUGGER") == "True":
import multiprocessing
if multiprocessing.current_process().pid > 1:
import debugpy
debugpy.listen(("0.0.0.0", 10001))
print("⏳ VS Code debugger can now be attached, press F5 in VS Code ⏳", flush=True)
debugpy.wait_for_client()
print("� VS Code debugger attached, enjoy debugging �", flush=True)
См. Эту статью Адриана: Отладка Flask в VS Code
Комментарии:
1. Спасибо. Это кажется полезным. Попытаюсь получить это в моем проекте.
2. @MrYutz, я и сейчас использую ваше решение, что довольно приятно. Есть только две вещи: 1) Почему вы проверяете
pid > 1
? 2) Если я вызову эту функцию в main () моего manage.py , он будет запускаться несколько раз, сбрасывая отладочный сервер и ожидая нового подключения.3. @LarsSchellhas — «В режиме отладки Flask использует первый процесс (с pid ==1) для запуска дочерних процессов, которые обрабатывают соединения. Если код под этой строкой выполняется основным процессом, используется порт отладки, и последующие дочерние процессы не могут использовать тот же порт и присваиваются случайный порт, который предотвращает соединения. »
4. Достаточно справедливо. Я использую не flask, а Django, так что, думаю, адаптировать его по-своему нормально 🙂