Dev Containers w VS Code - jedno środowisko dla wielu projektów

Pracując nad wieloma projektami infrastrukturalnymi szybko trafiamy na ten sam problem: każdy z nich wymaga odpowiedniej wersji narzędzi, rozszerzeń edytora i konfiguracji środowiska. OpenTofu, Ansible, Vault, Go, Python, direnv, certyfikaty, pluginy VS Code - lista rośnie, a ręczne przygotowanie kolejnego laptopa lub maszyny wirtualnej zabiera czas.
Rozwiązaniem są Dev Containers: kontenery developerskie uruchamiane bezpośrednio z Visual Studio Code. Repozytorium devcontainers zbiera gotowe profile środowisk oraz helpery, które pozwalają podpinać je do kolejnych projektów.
Do czego służy Dev Containers w VS Code?
Section titled “Do czego służy Dev Containers w VS Code?”Rozszerzenie Dev Containers pozwala uruchomić środowisko developerskie zdefiniowane w pliku .devcontainer/devcontainer.json. VS Code nadal działa na hoście, ale serwer edytora, terminal i komendy projektu uruchamiane są już w kontenerze.
Dzięki temu:
- wersje narzędzi są zapisane w kodzie zamiast w pamięci autora projektu,
- nowy projekt można otworzyć bez instalowania całego toolchainu na hoście,
- rozszerzenia VS Code są dobierane do rodzaju pracy,
- kilka projektów może używać różnych środowisk bez konfliktów,
- aktualizację wspólnych narzędzi można wykonać w jednym miejscu.
Pod spodem nadal działa Docker. Dev Containers dodaje warstwę integracji z VS Code: buduje obraz, uruchamia kontener, montuje workspace i otwiera projekt w ścieżce wskazanej przez konfigurację.
Jak zbudowane jest repozytorium?
Section titled “Jak zbudowane jest repozytorium?”Repozytorium rozdziela konfigurację na profile, wspólne skrypty i proste helpery:
Każdy profil zawiera dwa podstawowe pliki:
devcontainer.json opisuje sposób uruchomienia środowiska przez VS Code: obraz, workspace, mounty, użytkownika oraz rozszerzenia edytora. Dockerfile buduje środowisko i instaluje potrzebne narzędzia. Powtarzalne kroki zostały przeniesione do common/scripts/, dzięki czemu nie trzeba kopiować tych samych instrukcji do każdego profilu.
Dostępne profile
Section titled “Dostępne profile”| Profil | Przeznaczenie |
|---|---|
base | Bazowe środowisko developerskie z shellem, Gitem, direnv, Node.js i Codex CLI. |
opentofu | Praca z OpenTofu oraz narzędziami dla kodu infrastruktury. |
ansible | Środowisko dla projektów automatyzowanych przez Ansible. |
vault | Praca z HashiCorp Vault CLI. |
golang | Toolchain dla projektów Go. |
python | Środowisko dla projektów Python, rozszerzone między innymi o conftest. |
Pierwsze uruchomienie
Section titled “Pierwsze uruchomienie”Przed rozpoczęciem pracy potrzebne są:
- Docker,
- Visual Studio Code,
- rozszerzenie Dev Containers,
- lokalna kopia repozytorium
devcontainers.
Najprostszy wariant to podpięcie profilu jako symlink. Helper devcontainer-link tworzy w projekcie dowiązanie .devcontainer do wybranego profilu.
-
Przejdź do repozytorium projektu
Section titled “Przejdź do repozytorium projektu” -
Podepnij profil
Section titled “Podepnij profil”Efekt odpowiada ręcznemu utworzeniu dowiązania:
-
Otwórz projekt w kontenerze
Section titled “Otwórz projekt w kontenerze”W VS Code uruchom polecenie:
-
Poczekaj na zbudowanie obrazu
Section titled “Poczekaj na zbudowanie obrazu”VS Code zbuduje obraz i ponownie otworzy projekt. Dla profilu
opentofuwykona także kontrolne polecenie:
Od tej chwili terminal otwierany w VS Code działa wewnątrz kontenera.
Dlaczego ścieżka projektu się nie zmienia?
Section titled “Dlaczego ścieżka projektu się nie zmienia?”Domyślnie Dev Containers montuje kod w katalogu podobnym do /workspaces/nazwa-projektu. W projektach infrastrukturalnych wygodniej jest zachować tę samą ścieżkę na hoście i w kontenerze, szczególnie gdy skrypty odwołują się do innych repozytoriów.
Profile takie jak opentofu konfigurują więc:
Jeśli projekt na hoście znajduje się tutaj:
to po otwarciu kontenera nadal pracujemy w:
Nie trzeba zmieniać ścieżek w skryptach ani zastanawiać się, czy polecenie zostało uruchomione na hoście, czy już w kontenerze.
Dwa sposoby podpinania profilu
Section titled “Dwa sposoby podpinania profilu”Repozytorium obsługuje dwa warianty pracy. Wybór zależy od tego, czy projekt ma korzystać z centralnie utrzymywanego profilu, czy przechowywać własną kopię konfiguracji.
Wariant 1: symlink do profilu
Section titled “Wariant 1: symlink do profilu”To najwygodniejsze rozwiązanie dla lokalnych projektów utrzymywanych na tej samej maszynie. Projekt zawsze korzysta z aktualnego profilu z repozytorium devcontainers. Po zmianie Dockerfile wystarczy w VS Code wykonać:
Symlink ma jednak jedną ważną konsekwencję: projekt zależy od lokalnej ścieżki repozytorium devcontainers.
Wariant 2: renderowanie konfiguracji do projektu
Section titled “Wariant 2: renderowanie konfiguracji do projektu”Jeżeli projekt powinien zawierać własną, samowystarczalną kopię .devcontainer, można ją wygenerować:
Helper zapisze:
Renderowana konfiguracja ma lokalny build context i własną kopię wspólnych skryptów. Można ją przechowywać razem z projektem, udostępniać innym osobom oraz modyfikować niezależnie od centralnego repozytorium.
Aby później odświeżyć wygenerowany wariant, wystarczy uruchomić:
Polecenie odczyta nazwę profilu z .devcontainer/.profile i ponownie wykona render.
Co znajduje się w profilu?
Section titled “Co znajduje się w profilu?”Spójrzmy na najważniejsze fragmenty konfiguracji opentofu.
Build obrazu
Section titled “Build obrazu”Kontekst budowania wskazuje repozytorium devcontainers, ponieważ Dockerfile korzysta ze wspólnych skryptów:
Integracja użytkownika i repozytoriów
Section titled “Integracja użytkownika i repozytoriów”Kontener używa tego samego katalogu domowego i widzi drzewo /repo. Dzięki temu wewnątrz kontenera dostępne są między innymi konfiguracja shella, Git, SSH oraz sąsiednie projekty.
Rozszerzenia VS Code
Section titled “Rozszerzenia VS Code”Profil może automatycznie doinstalować rozszerzenia właściwe dla danego rodzaju projektu:
Po otwarciu projektu dostajemy więc nie tylko CLI, lecz także gotowy edytor.
Jak rozwijać repozytorium?
Section titled “Jak rozwijać repozytorium?”Rozwój repozytorium polega najczęściej na aktualizacji wspólnego skryptu, zmianie istniejącego profilu albo dodaniu kolejnego profilu.
Zmiana wspólnego narzędzia
Section titled “Zmiana wspólnego narzędzia”Jeżeli narzędzie ma znaleźć się w kilku środowiskach, dodaj lub zmodyfikuj skrypt w:
Następnie wywołaj go w Dockerfile odpowiednich profili. Przykładowo instalacja direnv jest współdzielona przez wiele obrazów:
Aktualizacja istniejącego profilu
Section titled “Aktualizacja istniejącego profilu”Każdy profil rozwijamy w jego katalogu:
Zmiana w Dockerfile wpływa na zawartość obrazu. Zmiana w devcontainer.json wpływa na sposób uruchamiania kontenera przez VS Code: mounty, rozszerzenia, użytkownika, workspace i komendy startowe.
Dodanie nowego profilu
Section titled “Dodanie nowego profilu”-
Utwórz katalog profilu
Section titled “Utwórz katalog profilu” -
Dodaj Dockerfile
Section titled “Dodaj Dockerfile”Wybierz możliwie prosty obraz bazowy i wykorzystaj skrypty z
common/scripts/. -
Dodaj
Section titled “Dodaj devcontainer.json”devcontainer.jsonSkonfiguruj
build,remoteUser, mounty, workspace oraz rozszerzenia VS Code dopasowane do technologii. -
Sprawdź profil lokalnie
Section titled “Sprawdź profil lokalnie”Podepnij go do testowego projektu:
Następnie otwórz katalog w VS Code i wykonaj:
Walidacja zmian
Section titled “Walidacja zmian”Przed wysłaniem zmian warto wykonać podstawowe testy statyczne:
Można również sprawdzić renderowanie na katalogu tymczasowym:
Na końcu pozostaje test praktyczny: przebudowanie kontenera w VS Code oraz uruchomienie podstawowego polecenia dla danego profilu, na przykład:
Kiedy używać którego wariantu?
Section titled “Kiedy używać którego wariantu?”| Potrzeba | Najlepszy wybór |
|---|---|
| Kilka własnych projektów na jednej maszynie | devcontainer-link |
| Centralna aktualizacja środowiska bez kopiowania plików | devcontainer-link |
| Konfiguracja wersjonowana razem z projektem | devcontainer-render |
| Udostępnienie środowiska innym osobom | devcontainer-render |
Niezależne dostosowanie .devcontainer w konkretnym projekcie | lokalna kopia po devcontainer-render |
Dev Containers dobrze rozwiązuje problem powtarzalnego warsztatu pracy. Zamiast dokumentować kolejną listę pakietów do ręcznej instalacji, utrzymujemy wykonywalną definicję środowiska. VS Code staje się wejściem do projektu, Docker zapewnia izolację, a wspólne profile pozwalają rozwijać narzędzia w jednym miejscu.