Разработка Python приложения в Docker контейнере с помощью VSCode

Предисловие

Я уже довольно давно пользуюсь VSCode и мне очень полюбилась данная IDE за свою скорость и простоту. Однако из коробки данная среда дает лишь базовые возможности и в этой статье я холчу рассказать вам как можно вести полноценную разработку Python приложения в контейнере со всеми взрослыми наворотами.

Судть предлагаемого мной метода заключается в создании виртуального контейнера с полным набором необходимых нам для разработки пакетов Python к которому мы будем подключаться с помощью VSCode. Одной из фитч предлагаемого мной подхода является возможность подключения к контейнеру для разработки на удаленном сервере по ssh.

В конце вступления я хотел бы перечислить преимущества которые дает данный подход:

  • Удобство и скорость развертывания
  • Работает на любой платформе. Абсолютно не важно на какой системе вы планируете вести разработку linux, macos или windows.
  • Одиннаково работает как на локальной машине так и на удаленном сервере.
  • Нет разницы между dev и prod средой.

Настройка окружения

Шаги которые нам необходимо выполнить будут немного отличаться в зависимости от того где мы хотим вести разработку, на локальной машине или удаленном хосте. В этом разделе мы проведем с вами всю работу по настройке нашей IDE. Для развертывания полноценной среды разработки вам понадобиться установить всего три программы, итак поехали!

Подготовка

Для начала работы нам понадобиться установить VSCode, Git и Docker. Думаю с этим не должно возникнуть проблем, однако, если они все таки возникли вы можете задать вопрос в нашем чате в Telegram.

Устанавливаем расширения

Для выполнения поставленной задачи нам понадобится установить 3 расширения для VSCode. Разработчиком данных расширений является Microsoft что вселяет хоть какую-то уверенность в их надежности.

Remote Development

Это расширение на самом деле явлеяется набором содержашим в себе функционал для подключения VSCode к контейнерам Docker, а текже подключению по ssh к удаленному серверу: https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack

Python

Нам понадобиться расширение для работы с Python оно будет обеспечивать корректную подсветку кода и подсказки по коду и синтаксису. https://marketplace.visualstudio.com/items?itemName=ms-python.python

Docker

Последнее расширение нужно для работы с Docker. С его помощью можно будет управлять контейнерами прямо из VSCode. Это может быть удобно тем кто не любит или еще не выучил консольные команды. https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker

Создание и запуск Docker контейнера

Итак, мы установили необходимые для работы расширения в наш редактор кода. Теперь нам нужно создать контейнер в котором будет весьтись разработка.

Для чего нужны все эти танцы с бубном? Если вы участовали в разработке серьезных проектов, то знаете что со временем они обрастают кучей зависимостей и их становится все сложней разворачивать на новых серверах и рабочих местах. А изменения в версиях каких либо пакетов или библиотек порой влекут за собой фатальные последствия. Docker дает нам возможность одной командой создать на любой машине виртуальный контейнер со всеми библиотеками и пакетами нужных версий что существенно облегчает жизнь для разработчиков и администраторов.

К делу. Создадим файл /docker/Dockerfile в котором будет прописана конфигурация нашего образа.

FROM python:3.8.8-buster

ENV PYTHONUNBUFFERED=1 DEBIAN_FRONTEND=noninteractive 

RUN apt-get update && pip install django \
    && apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release \
    && curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \
    && echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
        $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \
    && apt-get update \
    && apt-get install -y docker-ce-cli

WORKDIR /code

Кому лень копировать можете просто скачать файл с гитхаба: https://github.com/crankru/docker-django-vscode/blob/main/docker/Dockerfile

Создаем Docker-compose и запускаем контейнер В корне проекта создадим файл docker-compose.yml

version: '3'

services:
 app:
   build: ./docker
   entrypoint: python manage.py
   command: runserver 0.0.0.0:8000
   volumes:
     - ./:/code
     - /var/run/docker.sock:/var/run/docker.sock
   ports:
     - 8000:8000

Скачать с гитхаба https://github.com/crankru/docker-django-vscode/blob/main/docker-compose.yml

Запускаем билд командой docker-compose build app

После успешного завершения билда мы можем запустить наш образ, командой docker-compose run app bash. Наш контейнер для разработки запущен.

Подключаемся

Итак самая сложная работа сделана, теперь давайте посмотрим что нам это дало. Во кладке Docker находим наш запущенный контейнер, кликаем по нему правой кнопкой и выбираем Attach Visual Studio Code.

Теперь наш VSCode подключен к контейнеру и мы можем выполнить настройки нашей среды внутри контейнера.

Устанавливаем расширение внутри контейнера

После подключение VSCode к контейнеру нам нужно установить необходимые плагины для полноценной разработки. Переходим во вкладку Extensions и находим установленные глобально расширения Docker и Python после чего кликаем на установку чтобы развернуть их внутри контейнера.

После установки Python расширения может потребоваться выбрать версию установленную в контейнере, в примере используется Python 3.8.8

Запуск сервера разработки

После того как мы подключились внутрь контейнера нам осталось запустить сервер для разработки Django командой python manage.py runserver 0.0.0.0:8000. После запуска мы можем открыть в браузере страницу http://localhost:8000 и убедится что Django работает.

root@59ac55e54400:/code# python manage.py runserver 0.0.0.0:8000
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
April 14, 2021 - 19:37:16
Django version 3.1.7, using settings 'project.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
[14/Apr/2021 19:45:53] "GET / HTTP/1.1" 200 16351

Пример автодополнения

Теперь сделаем простую вместо главной страницы, для этого добавим пару строчек в файл: project/urls.py:

from django.contrib import admin
from django.urls import path
from django.http import HttpResponse

def test_view(request):
    return HttpResponse('<html><h1>Test page</h1></html>')

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', test_view),
]

Пример на гитхабе https://github.com/crankru/docker-django-vscode/blob/master/project/urls.py

Пример отображения ошибок

Делаем ошибки и показываем как они подсвечиваются...

ss

Результат

В итоге у нас есть git репозиторий который можно развернуть из консоли одной командой https://github.com/crankru/docker-django-vscode

Мы научились создавать полноценную виртуальную среду разработки которую можно запустить в любом месте буквально за несколько команд. Я не настаиваю что мой подход ениственно верный и в этой статье я хотел показать один из подходов в разработке дающий большую гибкость.

Давайте еще раз посмотрим что же мы получили: ...

Работающий пример из статьи вы можете посмотреть и скачать с Github: https://github.com/crankru/docker-django-vscode

Спасибо что прочитали статью! Если у вас есть идеи и предложения по улучшению данного подхода буду рад обсудить их в Telegram


Комментарии:

  • pavel.galagan.mail@gmail.com
    Отлично, ждём продолжения!
    12 Янв 2021, 14:47 ответить

Пожалуйста, авторизуйтесь что бы оставлять комментарии.