Środowisko deweloperskie w kontenerze

Niedawno pomyślałem sobie jak to wdrażając drugą osobę w nowe środowisko do pracy z nową technologią możemy mieć problem. Zamiast wymagać od nich umiejętności instalacji X paczek, edycji plików konfiguracyjnych, etc. chcemy dać im środowisko, gdzie kod od razu będzie się kompilował. A jakby użyć do tego Docker?

Postanowiłem przygotować sobie środowisko do pracy z F# i .NET Core, więc utworzyłem Dockerfile, który bazował na obrazie microsoft/dotnet:2.0-sdk. Zacząłem od instalacji paczki F#. Ponieważ na razie nie ma wsparcia FSI dla .NET Core to oznacza to zainstalowanie całego mono-complete. Następnie chciałem zainstalować w obrazie VS Code. Do tego okazuje się potrzeba bardzo dużo paczek

RUN apt-get install libnotify4 libnss3 libxkbfile1 libgconf-2-4 \
                libsecret-1-0 libgtk2.0-0 libxss1 libasound2 -y
RUN curl -L "https://go.microsoft.com/fwlink/?LinkID=760868" -o vscode.deb
RUN dpkg -i vscode.deb

Na koniec określiłem, żeby uruchamiając kontener uruchamiać VS Code i czekać na jego zamknięcie (flaga -w)

CMD code -w /home/dev/workdir --user-data-dir /home/dev

Tak przygotowany Dockerfile zbudowałem poleceniem

docker build -t manio143/fscodeenv .

Następnie trzeba urchomić kontener w trybie udostępniania X11. Obecnie protokół X11 posiada pewne zabezpieczenia, więc aby móc korzystać z udostępnionego socketa to trzeba zmienić uprawnienia, żeby użytkownik root mógł korzystać. W tym celu uruchamiamy polecenie

xhost +SI:localuser:root

Powyższe ma skutek tylko w danej sesji, więc po ponownym uruchomieniu komputera należy wykonać polecenie ponownie (albo poszukać jak dodać te uprawnienia na stałe).

Uruchomimy nasz kontener tym poleceniem

docker run \
    -e DISPLAY=unix$DISPLAY \
    -v $HOME/Code:/home/dev/workdir \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    --net=host \
    manio143/fscodeenv

Gdzie --net-host oznacza uruchomienie konteneru w tej samej sieci co host, bez izolacji w podsieci; zmienna DISPLAY oznacza gdzie jest uruchomiony X11; wolumen /tmp/.X11-unix to plik naszego udostępnianego socketu, a drugi wolumen to nasz folder z kodem.

I tak oto uruchamiamy VS Code z wewnątrz kontenera na naszym komputerze mając izolowane środowisko programistyczne z odpowiednimi narzędziami. W dodatku jest ono przenośne, idąc na inny komputer wystarczy, że będzie miał zainstalowany Docker, a my jednym poleceniem pobieramy niezbędne narzędzia.

Kompletny Dockerfile znajdziesz tutaj, a mój gotowy obraz na Docker Hubie.