Skip to content

Devcontainers + plugin VSCode

W pracy nad wieloma projektami infrastrukturalnymi (OpenTofu, Ansible, Vault, GitLab CI) szybko pojawia się ten sam problem: jak zapewnić powtarzalne, gotowe do pracy środowisko developerskie — bez ręcznego konfigurowania systemu na każdym laptopie czy VM. Artykuł pokazuje konkretne rozwiązanie, które sprawdza się w codziennej pracy.

  • Powtarzalność: identyczne środowisko na każdym hoście — koniec z „u mnie działa”
  • Izolacja: narzędzia nie brudzą systemu hosta — kontener można zniszczyć i postawić od nowa
  • Konfiguracja użytkownika: katalog /userfiles z kluczami SSH, .gitconfig, .zshrc montowany jako bind-mount
  • Automatyzacja: postCreateCommand uruchamia bootstrap przy każdym starcie kontenera
  • Wersjonowanie obrazu: gotowy kontener publikowany w GitLab Container Registry

Oba podejścia rozwiązują ten sam problem, ale w różny sposób:

  • Dev Container: ściślejsza integracja z VSCode, szybszy start (Docker vs VirtualBox), lżejszy (kontener vs VM)
  • Vagrant: lepsza izolacja sieciowa, pełny OS, przydatny przy testach infrastruktury wymagających VM
  • W praktyce: Dev Containery sprawdzają się przy pracy z kodem (IaC, skrypty, CI), Vagrant przy testach infrastruktury

⚙️ devcontainer

Środowisko developerskie w kontenerze Docker

Zawartość konfiguracji:

  • devcontainer.json — konfiguracja kontenera
  • Dockerfile — własny obraz bazowy
  • .userfiles/ — symlink do katalogu konfiguracji
  • bootstrap.sh — skrypt inicjalizacyjny

🔗 Dokumentacja VSCode

🗄️ GitLab Container Registry

Rejestr obrazów dla gotowych kontenerów

Przechowuje:

  • Obraz deweloperski (opentofu:0.0.1)
  • Wersjonowanie przez semver
  • Dostęp z tokenem GitLab
  • Gotowy do pobrania przez docker pull

🔗 Odwiedź


  1. Instalacja Dockera
  2. Instalacja pluginu do VSCode
  3. Utworzenie katalogu /userfiles
  4. Utworzenie dowiązania symbolicznego .userfiles
  5. Konfiguracja .devcontainer/devcontainer.json
  6. Przygotowanie Dockerfile
  7. Przygotowanie skryptu bootstrap

Docker jest wymagany jako backend dla Dev Containerów. Zainstaluj go zgodnie z oficjalną dokumentacją dla swojego systemu:

# Ubuntu/Debian
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER

Zainstaluj oficjalny plugin Dev Containers z marketplace VSCode:

Katalog /userfiles zawiera konfigurację użytkownika montowaną do każdego kontenera — klucze SSH, aliasy shell, konfigurację git:

/userfiles
├── bootstrap.bash
├── configure_user.bash
├── .zshrc
├── .gitconfig
├── .gitignore_global
└── .ssh/
    ├── priv
    ├── priv.pub
    └── known_hosts

Dzięki bind-mountowi pliki z /userfiles są dostępne wewnątrz kontenera pod tą samą ścieżką — bootstrap kopiuje je do $HOME użytkownika w kontenerze.

W katalogu repozytorium tworzysz symlink wskazujący na /userfiles:

ln -s /userfiles .userfiles

Plik .devcontainer/devcontainer.json definiuje konfigurację kontenera deweloperskiego:

{
  "name": "iac-gitlab",
  "build": {
    "dockerfile": "Dockerfile"
  },
  "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/${localWorkspaceFolderBasename},type=bind,consistency=cached",
  "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
  "runArgs": [
    "--network=host"
  ],
  "mounts": [
    "source=/userfiles,target=/userfiles,type=bind"
  ],
  "customizations": {
    "vscode": {
      "extensions": []
    }
  }
}

Kluczowe elementy:

  • mounts: bind-mount katalogu /userfiles z hosta do kontenera
  • runArgs: --network=host przydatne przy testach sieciowych
  • customizations.vscode.extensions: lista rozszerzeń VSCode instalowanych automatycznie

Własny obraz oparty na Ubuntu 24.04 z minimalistycznym zestawem narzędzi:

FROM ubuntu:24.04

RUN apt-get update \
  && apt-get install -y --no-install-recommends \
    ca-certificates \
    curl \
    direnv \
    git \
    openssh-client \
    sudo \
    tar \
    unzip \
    zsh \
  && rm -rf /var/lib/apt/lists/*

Narzędzia dobrane pod pracę z IaC:

  • direnv: automatyczne ładowanie zmiennych środowiskowych z .envrc
  • zsh: shell z możliwością użycia konfiguracji z .userfiles/.zshrc
  • openssh-client: klucze SSH z /userfiles/.ssh/

Skrypt .userfiles/bootstrap.sh uruchamiany przez postCreateCommand przy tworzeniu kontenera:

#!/bin/bash
cp -fr /userfiles/.* $HOME/
source ~/.zshrc
direnv allow

Trzy kroki:

  1. Kopiuje pliki dotfiles z /userfiles do $HOME w kontenerze
  2. Ładuje konfigurację zsh
  3. Aktywuje direnv dla bieżącego katalogu roboczego

Jeśli chcesz udostępnić gotowy obraz zespołowi, możesz opublikować go w GitLab Container Registry.

  1. Zaloguj się do rejestru

    docker login registry.gitlab.com
  2. Znajdź identyfikator kontenera

    VSCode buduje obraz z automatycznie generowaną nazwą — znajdź go poleceniem:

    docker images

    Przykładowy wynik:

    IMAGE                                                                                      ID             DISK USAGE
    vsc-iac-gitlab-72c45f5e1ed25a8c0d801e27eec2c072c6ed78470b8589b0d63eefc43917013a:latest    9832794997dc        432MB
  3. Nadaj właściwą nazwę i tag

    docker tag vsc-iac-gitlab-72c45f5e1ed25a8c0d801e27eec2c072c6ed78470b8589b0d63eefc43917013a \
      registry.gitlab.com/pl.rachuna-net/artifacts/containers/opentofu:0.0.1
  4. Opublikuj obraz

    docker push registry.gitlab.com/pl.rachuna-net/artifacts/containers/opentofu:0.0.1

ZasóbCzego się nauczysz
Dev Containers SpecSpecyfikacja formatu devcontainer.json
VSCode Dev ContainersIntegracja z VSCode
Docker DocsBudowanie i zarządzanie obrazami
GitLab Container RegistryPublikowanie obrazów
Nasze konteneryGotowe obrazy deweloperskie

Maciej Rachuna | rachuna-net.pl

Artykuł opisuje realne środowisko deweloperskie używane przy projektach IaC. Konfiguracja devcontainer.json, Dockerfile i skrypty bootstrap bazują na praktyce, a nie na teorii.