Среда разработки с использованием Devpod | devcontainer
Table of contents

DevPod: воспроизводимые среды разработки на базе Dev Container
DevPod — это клиентский инструмент для создания воспроизводимых сред разработки на основе спецификации Dev Container (devcontainer.json). Он позволяет запускать одинаковые пользовательские окружения разработки на различных бэкендах/серверах без привязки к конкретной платформе.
Каждая среда разработки запускается в контейнере и полностью описывается файлом devcontainer.json: базовый образ, зависимости, инструменты и настройки. За счёт системы провайдеров DevPod такие окружения могут быть развёрнуты на локальной машине, в Kubernetes-кластере, на удалённом сервере по SSH или в виртуальной машине любого облачного провайдера.
Использование стандарта Dev Container
DevPod опирается на открытый стандарт Dev Container, который также используется в GitHub Codespaces и VS Code Dev Containers. Это позволяет описывать среду разработки один раз и использовать её независимо от способа запуска и выбранного бэкенда/сервера.
В результате разработчик получает единый и предсказуемый интерфейс работы с проектом — как локально, так и в удалённой инфраструктуре.
Преимущества DevPod
По сравнению с управляемыми сервисами облачной разработки (GitHub Codespaces, JetBrains Spaces, Google Cloud Workstations), DevPod предлагает более гибкую и контролируемую модель.
Экономическая эффективность
DevPod, как правило, в 5–10 раз дешевле сопоставимых хостинговых решений. Он использует обычные виртуальные машины у выбранного провайдера и автоматически останавливает неиспользуемые ресурсы, снижая затраты на инфраструктуру.
Отсутствие vendor lock-in
DevPod не привязывает пользователя к конкретному облаку. Можно выбрать любого провайдера — исходя из стоимости, доступности или производительности. И при необходимости сменить его одной командой.
Единый опыт локальной и удалённой разработки
Один и тот же devcontainer может использоваться как для локальной разработки, так и для работы в удалённой среде. Это снижает когнитивную нагрузку и упрощает переход между разными сценариями работы.
Поддержка IDE
DevPod поддерживает:
- clion
- fleet
- goland
- intellij
- jupyternotebook
- openvscode
- phpstorm
- pycharm
- rider
- rubymine
- webstorm
- None
- любые другие редакторы через стандартное SSH-подключение.
Клиентская архитектура
DevPod не требует развёртывания серверной части. Вся логика управления средами разработки находится на стороне клиента, что упрощает внедрение и эксплуатацию.
Open-source и расширяемость
DevPod полностью открыт и расширяем. При отсутствии подходящего провайдера можно реализовать собственный, адаптированный под конкретную инфраструктуру.
Графическое приложение и CLI
DevPod поставляется с настольным приложением, которое упрощает работу и скрывает инфраструктурные детали. Для автоматизации и интеграций доступен полнофункциональный CLI.
Как это работает
Ниже приведен общий обзор того, как DevPod использует вашу локальную среду, репозиторий исходного кода и контейнер разработчика для развертывания рабочего пространства.
DevPod — диаграмма компонентов

Quickstart DevPod CLI
Install DevPod
Можно использовать GUI приложение, но лучше CLI
Графическое приложение:
Install DevPod CLI
curl -L -o devpod "https://github.com/loft-sh/devpod/releases/latest/download/devpod-linux-amd64" && sudo install -c -m 0755 devpod /usr/local/bin && rm -f devpodДобавление провайдера
Команда DevPod поддерживает провайдеров для таких сервисов:
- Docker (docker)
- Kubernetes (kubernetes)
- SSH (ssh)
- AWS (aws)
- Google Cloud (gcloud)
- Azure (azure)
- Digital Ocean (digitalocean)
Для получения списка доступных провайдеров:
devpod provider list-availableЧерез настольное приложение DevPod
Перейдя в окно «Провайдеры» нажать «Добавить». Выбрать одного из провайдеров, или нажать кнопку «+», чтобы добавить своего.
Добавление пользовательского провайдера
После нажатия кнопки «Добавить» в разделе «Провайдеры», нажать кнопку «+», а затем заполнить раздел «Источник» одним из следующих элементов
- Ссылкой GitHub на проект провайдера
- URL-адресом provider.yaml
- Путем к файлу provider.yaml
Через DevPod CLI
Провайдеры из этого списка могут быть установлены, например:
devpod provider add docker
devpod provider add kubernetes
devpod provider add ssh
devpod provider add aws
devpod provider add azure
devpod provider add gcloud
devpod provider add digitaloceanНесколько провайдеров одновременно
Для этого нужно использовать флаг --name, чтобы добавить несколько провайдеров одного типа с разными параметрами.
Из Github
Для пользовательского провайдера из GitHub, использовать формат my-username/repo, например:
devpod provider add loft-sh/devpod-provider-terraformИз локальной директории
devpod provider add ../devpod-provider-mock/provider.yamlДля чего это мне
Мой сценарий использования не разработка а DevOps направление. Подключение и сетап серверов, Ansible плейбуки, работа с кубером и прочее.
provider.yaml
name: podman
version: v0.0.1
icon: https://devpod.sh/assets/docker.svg
home: https://github.com/loft-sh/devpod
description: |-
DevPod on Podman
optionGroups:
- options:
- DOCKER_PATH
- DOCKER_HOST
- INACTIVITY_TIMEOUT
- DOCKER_BUILDER
name: "Advanced Options"
options:
INACTIVITY_TIMEOUT:
description: "If defined, will automatically stop the container after the inactivity period. Examples: 10m, 1h"
DOCKER_PATH:
description: The path where to find the docker binary.
default: podman
DOCKER_HOST:
global: true
description: The docker host to use.
DOCKER_BUILDER:
global: true
description: The docker builder to use.
agent:
containerInactivityTimeout: ${INACTIVITY_TIMEOUT}
local: true
docker:
path: ${DOCKER_PATH}
builder: ${DOCKER_BUILDER}
install: false
env:
DOCKER_HOST: ${DOCKER_HOST}
exec:
command: |-
"${DEVPOD}" helper sh -c "${COMMAND}"Добавление провайдера
devpod provider add provider.yamlПросмотр списка подключенных
devpod provider list
Далее я создаю директорию debian13, так будет называться мой контейнер, мое окружение. В ней делаем вложенную директорию .devcontainer.
В этой директории создаю devcontainer.json и рядом Dockerfile

В директории configs у меня лежат дополнительные конфиги zsh, vim.
devcontainer.json
{
"name": "Debian 13 Dev",
"build": {
"dockerfile": "Dockerfile"
},
"image": "debian:testing",
"features": {
"ghcr.io/devcontainers/features/git:1": {}
},
"mounts": [
"source=${localEnv:HOME}${localEnv:USERPROFILE}/.ssh,target=/home/devuser/.ssh,type=bind,consistency=cached"
],
//"postCreateCommand": "sudo apt-get update && sudo apt-get install -y sudo curl neovim htop",
"remoteUser": "devuser",
"overrideCommand": false,
"updateRemoteUserUID": false,
"runArgs": [
"--hostname",
"debian13"
]
}В блоке mounts можно прокинуть, сбиндить ключи в контейнер для работы с гитом и прочими серверами. Ну или же подключить необходимые директории для работы с ними.
Dockerfile
FROM debian:testing
RUN useradd -m -s /usr/bin/zsh devuser \
&& mkdir -p /etc/sudoers.d \
&& echo "devuser ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/devuser \
&& apt-get update \
&& apt-get install -y sudo wget iputils-ping curl lsd neovim htop mc git fzf rsync zsh zsh-autosuggestions kubectl gnupg gpg tmux tree-sitter-cli luarocks locales ripgrep \
&& apt-get clean
RUN wget -qO- https://apt.releases.hashicorp.com/gpg | \
gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg && \
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com trixie main" > \
/etc/apt/sources.list.d/hashicorp.list
RUN apt update && apt install terraform && apt-get clean
#COPY configs/.zshrc /home/devuser/
#COPY configs/nvim/ /home/devuser/.config/nvim
#COPY configs/tmux/ /home/devuser/.config/tmux
#RUN chown -R devuser:devuser /home/devuser
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
RUN sed -i 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen
RUN locale-gen
USER devuser
WORKDIR /home/devuser
CMD ["sleep", "infinity"]Создаем контейнер
devpod up . --ide noneТак пересобрать
devpod up . --ide none --recreateГлянуть список всех наших окружений
devpod ls
Подключаемся
ssh debian13.devpod
Теперь можно засорять контейнер а не хостовую машину или сервер.