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 lub VM.
Założenia architektoniczne
Section titled “Założenia architektoniczne”Celem jest środowisko stworzenie kontenera deweloperskiego, które:
- działa identycznie na każdym hoście,
- za pomocą katalogu .userfiles, konfiguruje wstępnie kontener użytkownika, tak aby można było pracować wewnątrz.
Kluczowe elementy:
- Dev Container oparty o własny obraz Dockera,
- bind-mount katalogu
.userfiles, - postCreateCommand jako punkt wejścia do bootstrapu.
Krok po kroku
Section titled “Krok po kroku”-
Instalacja dockera
Section titled “Instalacja dockera” -
Instalacja pluginu do vscode
Section titled “Instalacja pluginu do vscode” -
Utworzenie katalogu /userfiles
Section titled “Utworzenie katalogu /userfiles”Utworzyłem katalog w /userfiles, w którym skopiowałem wszystkie potrzebne pliki użytkownika, tak bym mógł pracować w jego konteście
/userfiles ├── bootstrap.bash ├── configure_user.bash ├── .zshrc ├── .gitconfig ├── .gitignore_global └── .ssh/ ├── priv ├── priv.pub └── known_hosts -
Utworzenie dowiązania symbolicznego do repo
Section titled “Utworzenie dowiązania symbolicznego do repo”ln -s /userfiles .userfiles -
Utworzenie pliku .devcontainer/devcontainer.json
Section titled “Utworzenie pliku .devcontainer/devcontainer.json”{ "name": "iac-gitlab", "build": { "dockerfile": "Dockerfile" }, "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/${localWorkspaceFolderBasename},type=bind,consistency=cached", "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", "runArgs": [ "--network=host" // w specyficznych przypadkach ], "mounts": [ "source=/userfiles,target=/userfiles,type=bind" ], "customizations": { "vscode": { "extensions": [] } } } -
Utworzenie Dokerfile
Section titled “Utworzenie Dokerfile”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/* -
Utworzenie skryptu .userfiles/bootstrap.sh
Section titled “Utworzenie skryptu .userfiles/bootstrap.sh”#!/bin/bash cp -fr /userfiles/.* $HOME/ source ~/.zshrc direnv allow
Extra: Publikacja kontenera
Section titled “Extra: Publikacja kontenera”-
Docker login
Section titled “Docker login”docker login registry.gitlab.com -
Ustawienie taga dla .devcontainer
Section titled “Ustawienie taga dla .devcontainer”Szukanie kontenera, który nas interesuje:
docker images i Info → U In Use IMAGE ID DISK USAGE CONTENT SIZE EXTRA vsc-iac-gitlab-72c45f5e1ed25a8c0d801e27eec2c072c6ed78470b8589b0d63eefc43917013a:latest 9832794997dc 432MB 0B URename kontenera
docker tag vsc-iac-gitlab-72c45f5e1ed25a8c0d801e27eec2c072c6ed78470b8589b0d63eefc43917013a registry.gitlab.com/pl.rachuna-net/artifacts/containers/opentofu:0.0.1Push kontenera
docker push registry.gitlab.com/pl.rachuna-net/artifacts/containers/opentofu:0.0.1