Повышение производительности диска в среде контейнера разработки с помощью именованных томов

Что такое контейнеры VS Code Dev?

Удаленные контейнеры Visual Studio Code - это расширение VS Code, которое решает одну из старейших проблем разработки программного обеспечения: Но оно работает на моей машине. Контейнеры Dev также позволяют сократить разрыв между средой разработки и производственной средой, что значительно упрощает отладку производственных проблем.

Если на вашем компьютере установлены Docker и VS Code, вы можете легко настроить свои проекты с помощью файла Dockerfile и файла devcontainer.json. С помощью расширения контейнера разработчика VS Code может открыть рабочую область вашего проекта в изолированной среде со всеми зависимостями, определенными в файле Dockerfile. Таким образом, любой, кто клонирует репозиторий, сможет запустить точно такую ​​же среду разработки - независимо от того, какую операционную систему хоста он использует.

Проблемы с производительностью в Windows

К сожалению, при запуске контейнеров разработки в Windows возникают проблемы с производительностью. В некоторых случаях мне даже не удавалось запустить npm install, чтобы установить необходимые зависимости пакетов для моих проектов. Докер просто зависнет. Для проектов, у которых было меньше зависимостей, установка зависимостей по-прежнему занимала намного больше времени, чем когда я разрабатывал на своем MacBook Pro или даже загружал Linux на том же ПК. Это определенно не было проблемой с оборудованием.

Оказывается, это на самом деле кажется хорошо известной проблемой при запуске контейнеров разработчика в Windows, поскольку документация VS Code дает советы по повышению производительности диска контейнера. В нем конкретно упоминается node_module и указывается на использование именованных томов для решения проблемы.

Вот что они предлагают вам включить в devcontainer.json файл:

Это действительно решает проблему. Вот один из моих небольших проектов до и после создания именованного тома:

Как видите, это резко увеличивает производительность. Я не совсем уверен, в чем заключается основная проблема, но это может быть связано с тем, как Docker Desktop работает в Windows.

WSL2 еще не решает эту проблему

В Windows Docker Desktop до сих пор полагался на то, что по сути является эмулятором - запуск Docker внутри виртуальной машины. С появлением Подсистемы Windows для Linux 2 Linux гораздо глубже интегрирован в экосистему Windows, поэтому производительность файловой системы была значительно улучшена наряду с другими улучшениями производительности.

К сожалению, похоже, что улучшенная производительность файловой системы действительно применима только к файлам, которые хранятся в самой файловой системе Linux, поскольку файловая система Windows по-прежнему монтируется как удаленная файловая система в WSL2. Я очень сильно полагаюсь на файловые наблюдатели для перезагрузки в реальном времени, но, к сожалению, Docker под WSL2 не имеет надлежащей поддержки для этого.

По крайней мере, на данный момент я отключил WSL2 в Docker Desktop, пока эта проблема не будет решена.

Использование именованных томов в нескольких проектах

Как оказалось, именованные тома являются глобальными и могут совместно использоваться контейнерами. В некоторых случаях это может быть полезно, но я хотел изолировать свои среды друг от друга.

Я наткнулся на переменную среды с именем localWorkspaceFolderBasename, которая по сути позволяет мне определять имя тома на основе папки локальной рабочей области (т.е. имени проекта):

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

Например, если вы используете rm -rf node_modules, вам следует использовать rm -rf node_modules/*. Это удалит все файлы в папке, не пытаясь удалить саму папку.

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

Заключение

Контейнеры Dev чрезвычайно мощны, и я настоятельно рекомендую их использовать. Однако, когда я переключился с разработки на моем MacBook Pro на свой ПК с Windows, я определенно не ожидал, что у меня возникнут серьезные проблемы с производительностью. Пока я не нашел обходной путь именованных томов, я почти прибег к установке Linux на отдельный SSD, чтобы обойти эту проблему.

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