UNIXAWESOME

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

#docker #podman #devcontainer
Table of contents

devpod-pr

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 поддерживает:


Клиентская архитектура

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


Open-source и расширяемость

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


Графическое приложение и CLI

DevPod поставляется с настольным приложением, которое упрощает работу и скрывает инфраструктурные детали. Для автоматизации и интеграций доступен полнофункциональный CLI.


Как это работает

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

DevPod — диаграмма компонентов

workspaces



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 поддерживает провайдеров для таких сервисов:

Для получения списка доступных провайдеров:

devpod provider list-available

Через настольное приложение DevPod

Перейдя в окно «Провайдеры» нажать «Добавить». Выбрать одного из провайдеров, или нажать кнопку «+», чтобы добавить своего.


Добавление пользовательского провайдера

После нажатия кнопки «Добавить» в разделе «Провайдеры», нажать кнопку «+», а затем заполнить раздел «Источник» одним из следующих элементов


Через 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


Теперь можно засорять контейнер а не хостовую машину или сервер.

Reply to this post by email ↪

Or share: