====== Zrychlení Docker devcontaineru na Windows přes WSL2 ======
//Vytvořeno: **4.7.2026** | Aktualizováno: **~~LASTMOD~~**//
[[https://docs.docker.com/desktop/features/wsl/|Docker Desktop s WSL 2 backendem]] umožňuje na Windows provozovat Linux kontejnery nad WSL2. Pokud je ale projekt uložený na Windows disku a do [[https://code.visualstudio.com/docs/devcontainers/containers|Dev Containers]] se připojuje přes bind mount, mohou být diskové operace v kontejneru extrémně pomalé. Tento návod popisuje ověřený postup z [[https://opencode.e-nosek.cz/L2hvbWUvYWl3b3JrL3NjcmF0Y2g/session/ses_0d863da33ffeZIBQ4rhReC2RYh|pracovní OpenCode konverzace]]: přesunout workspace z Windows filesystemu do WSL2 Ubuntu filesystemu a teprve nad ním spustit Cursor/devcontainer.
===== Cíl =====
Původní stav:
Windows filesystem:
C:\cursor-ai
Docker kontejner:
/home/ubuntu <- bind mount z C:\cursor-ai
To bývá velmi pomalé, protože kontejner při práci se soubory sahá přes překladovou vrstvu Windows -> Linux.
Cílový stav:
WSL2 Ubuntu filesystem:
/home/panhe/cursor-ai
Docker kontejner:
/home/ubuntu <- bind mount z /home/panhe/cursor-ai
Data zůstávají mimo kontejner, přežijí rebuild kontejneru a zároveň se s nimi pracuje přes rychlý Linux filesystem.
===== Architektura =====
Po migraci jsou na Windows počítači dvě různé Linux vrstvy:
Windows
├─ WSL2 Ubuntu
│ └─ /home/panhe/cursor-ai
│ = fyzické místo, kde leží projektová data
│
└─ Docker Desktop
└─ Docker devcontainer Ubuntu
└─ /home/ubuntu
= vývojové prostředí, kam se data z WSL bind-mountují
WSL Ubuntu není Docker kontejner. Je to Linux distribuce běžící přes WSL2.
Docker kontejner je samostatné prostředí, které používá Docker Desktop. WSL Ubuntu slouží hlavně jako rychlý Linux filesystem a jako místo, odkud Cursor/Dev Containers spouští Docker příkazy. Docker kontejner je skutečné vývojové prostředí podle ''Dockerfile''.
===== Proč nestačí Cursor připojený do kontejneru =====
Pokud je v ''devcontainer.json'' nastavený bind mount:
"mounts": [
"source=${localWorkspaceFolder},target=/home/ubuntu,type=bind"
]
záleží na tom, odkud Cursor otevřel projekt.
Pokud Cursor otevře projekt z Windows cesty:
C:\cursor-ai
mountuje se do kontejneru Windows filesystem.
Pokud Cursor otevře projekt přes WSL cestu:
/home/panhe/cursor-ai
mountuje se do kontejneru WSL/Linux filesystem.
V Cursoru může prostředí vypadat stejně, protože v obou případech skončíš v kontejneru ve složce ''/home/ubuntu''. Rozdíl je ve zdroji mountu.
===== Co není potřeba měnit =====
V tomto scénáři není potřeba měnit ''Dockerfile''.
Také není nutné měnit ''devcontainer.json'', pokud se má dál mountovat celý obsah workspace do ''/home/ubuntu''.
Příklad původního nastavení může zůstat:
{
"name": "ai",
"build": {
"dockerfile": "Dockerfile"
},
"runArgs": [
"--name=ai",
"--cap-add=SYS_ADMIN",
"--shm-size=2gb"
],
"workspaceFolder": "/home/ubuntu",
"mounts": [
"source=${localWorkspaceFolder},target=/home/ubuntu,type=bind"
],
"remoteUser": "ubuntu",
"updateRemoteUserUID": true
}
Klíčová změna není v těchto souborech. Klíčová změna je v tom, že Cursor otevře projekt ze WSL filesystemu, ne z ''C:\''.
===== Postup =====
==== Krok 1: Zkontroluj WSL distribuce ====
Ve Windows otevři PowerShell a spusť:
wsl -l -v
Můžeš vidět například:
NAME STATE VERSION
* docker-desktop-data Running 2
docker-desktop Running 2
To znamená, že zatím existují jen interní WSL distribuce Docker Desktopu:
docker-desktop
docker-desktop-data
Tyto distribuce nejsou určené pro pracovní data. Nedávej do nich projekt a nepoužívej je jako pracovní Ubuntu.
==== Krok 2: Nainstaluj běžné Ubuntu do WSL2 ====
Pokud v seznamu není běžná distribuce, například ''Ubuntu-24.04'', nainstaluj ji podle [[https://learn.microsoft.com/en-us/windows/wsl/install|dokumentace Microsoft WSL]]:
wsl --install -d Ubuntu-24.04
Tento příkaz nevytváří Docker kontejner. Vytváří běžnou WSL2 Ubuntu distribuci, kde bude Linux filesystem:
/home/panhe/...
Po instalaci budeš vyzván k vytvoření Linux uživatele. V reálném příkladu byl uživatel:
panhe
==== Krok 3: Nastav Ubuntu jako defaultní WSL distribuci ====
Pokud je defaultní distribuce ''docker-desktop-data'', Cursor se může pokusit připojit právě do ní. To vede k chybám typu:
Resolving wsl remote authority 'wsl+docker-desktop-data'
getpwuid(0) failed
execvpe(bash) failed: No such file or directory
To znamená, že Cursor zkouší použít interní Docker distribuci, ne pracovní Ubuntu.
Nastav správný default:
wsl --set-default Ubuntu-24.04
Ověř:
wsl -l -v
Správně má být hvězdička u ''Ubuntu-24.04'':
NAME STATE VERSION
* Ubuntu-24.04 Running 2
docker-desktop Running 2
docker-desktop-data Running 2
==== Krok 4: Zkopíruj data z Windows do WSL ====
Původní složka byla:
C:\cursor-ai
Ve WSL je Windows disk ''C:'' dostupný jako:
/mnt/c
Takže původní složka je ve WSL vidět jako:
/mnt/c/cursor-ai
Spusť Ubuntu WSL:
wsl -d Ubuntu-24.04
Ve WSL vytvoř cílovou složku a zkopíruj obsah:
mkdir -p ~/cursor-ai
sudo apt update
sudo apt install -y rsync
rsync -a --info=progress2 /mnt/c/cursor-ai/ ~/cursor-ai/
Pozor na lomítko na konci:
/mnt/c/cursor-ai/
To znamená „zkopíruj obsah složky“, ne složku samotnou.
Po kopírování ověř:
cd /home/panhe/cursor-ai
pwd
ls
ls .devcontainer
git status
Správný ''pwd'' výstup:
/home/panhe/cursor-ai
Špatný výstup by byl:
/mnt/c/cursor-ai
==== Krok 5: Zapni Docker Desktop WSL integration ====
Když se Cursor připojí do WSL a pokusí se otevřít devcontainer, může se objevit chyba:
Failed to reopen folder in container: Error running docker info.
The command 'docker' could not be found in this WSL 2 distro.
We recommend to activate the WSL integration in Docker Desktop settings.
To neznamená, že je potřeba instalovat nový Docker engine do WSL.
Standardní řešení na Windows je použít Docker Desktop a zapnout jeho integraci do WSL distribuce. Postup je v [[https://docs.docker.com/desktop/features/wsl/|Docker Desktop WSL 2 dokumentaci]].
Ve Windows otevři Docker Desktop:
Settings -> Resources -> WSL Integration
Zapni:
Enable integration with my default WSL distro
Případně explicitně zapni:
Ubuntu-24.04
Pak klikni:
Apply & Restart
Ověř ve WSL:
docker version
docker info
docker ps -a
Pokud příkaz ''docker'' funguje, WSL Ubuntu umí komunikovat s Docker Desktopem.
==== Krok 5.1: Zajisti funkčnost po restartu Windows ====
Po restartu Windows může být WSL distribuce ve stavu:
Stopped
To samo o sobě není chyba. WSL distribuce se umí spustit automaticky ve chvíli, kdy ji něco potřebuje.
Pro praktickou práci ale může být pohodlnější zajistit, aby po přihlášení běžel Docker Desktop i WSL Ubuntu.
=== Automatický start Docker Desktopu ===
V Docker Desktopu otevři:
Settings -> General
Zapni:
Start Docker Desktop when you sign in
Potom zkontroluj:
Settings -> Resources -> WSL Integration
Musí být zapnuté:
Enable integration with my default WSL distro
a/nebo explicitně:
Ubuntu-24.04
=== Volitelné držení WSL Ubuntu přes sleep infinity ===
Pokud má WSL Ubuntu po startu Windows zůstat běžet pořád, lze použít Windows Task Scheduler.
Tento krok není povinný, ale je praktický, pokud má být prostředí po restartu předvídatelné a hned připravené pro Cursor.
Ve Windows otevři:
Task Scheduler
Vytvoř novou úlohu:
Create Basic Task
Název například:
Start WSL Ubuntu
Trigger:
When I log on
Action:
Start a program
Program:
wsl.exe
Arguments:
-d Ubuntu-24.04 --exec bash -lc "sleep infinity"
Tím se po přihlášení spustí Ubuntu WSL a uvnitř poběží nekonečný proces ''sleep infinity''. Díky tomu distribuce zůstane ve stavu ''Running''.
Co je dobré vědět:
* WSL Ubuntu po startu Windows běží a Cursor se do něj může rychleji připojit.
* WSL bude trvale zabírat část RAM.
* Task Scheduler úloha bude pořád ve stavu ''Running''.
* WSL poběží, ale Docker Desktop stejně musí být také nastartovaný.
''sleep infinity'' nenahrazuje Docker Desktop autostart ani WSL Integration. Jen drží WSL distribuci živou.
=== Ověření po restartu ===
Po restartu Windows ověř v PowerShellu:
wsl -l -v
Očekávané je, že ''Ubuntu-24.04'' může být ''Running'', pokud používáš ''sleep infinity'', nebo ''Stopped'', pokud keepalive nepoužíváš.
Při použití ''sleep infinity'' chceš vidět:
Ubuntu-24.04 Running 2
Potom ověř Docker dostupný z WSL:
wsl -d Ubuntu-24.04 -- docker ps
Pokud tento příkaz projde, WSL i Docker Desktop integrace fungují.
=== Jak WSL ručně zastavit ===
Pokud budeš chtít WSL Ubuntu ručně zastavit, spusť v PowerShellu:
wsl --terminate Ubuntu-24.04
Nebo zastav celé WSL prostředí:
wsl --shutdown
Pokud je zapnutá Task Scheduler úloha se ''sleep infinity'', WSL se znovu spustí při dalším přihlášení do Windows.
==== Krok 6: Otevři Cursor správně přes WSL ====
V Cursoru nepoužívej otevření složky přes Windows cestu:
C:\cursor-ai
Ani jako primární cestu nepoužívej síťovou Windows cestu:
\\wsl.localhost\Ubuntu-24.04\home\panhe\cursor-ai
Tato cesta je užitečná pro Windows Explorer, ale pro vývoj je lepší použít Cursor Remote WSL.
V Cursoru spusť Command Palette:
Ctrl + Shift + P
Použij:
Remote-WSL: New WSL Window
nebo:
WSL: Connect to WSL
Pokud je k dispozici více distribucí, vyber explicitně:
Ubuntu-24.04
V novém WSL okně Cursoru dej:
File -> Open Folder
Zadej Linux cestu:
/home/panhe/cursor-ai
Cursor najde:
/home/panhe/cursor-ai/.devcontainer/devcontainer.json
==== Krok 7: Rebuild devcontaineru ====
V Cursoru spusť:
Dev Containers: Rebuild and Reopen in Container
Pokud existuje starý kontejner se stejným jménem, například ''ai'', může nastat konflikt kvůli:
"--name=ai"
V tom případě je možné starý kontejner odstranit, ale pouze pokud je jasné, že důležitá data jsou v bind mountu a ne jen uvnitř kontejneru.
Příklad:
docker stop ai
docker rm ai
Potom znovu spusť rebuild devcontaineru.
==== Krok 8: Ověř, že nový kontejner používá WSL filesystem ====
Nejspolehlivější kontrola je přes ''docker inspect''.
Spusť ji ve WSL Ubuntu, ne uvnitř kontejneru:
docker inspect ai --format '{{range .Mounts}}{{println .Type .Source "->" .Destination}}{{end}}'
Správný výstup v reálném příkladu byl:
bind /home/panhe/cursor-ai -> /workspaces/cursor-ai
bind /home/panhe/cursor-ai -> /home/ubuntu
To je v pořádku. Znamená to, že zdroj dat je:
/home/panhe/cursor-ai
a ne:
C:\cursor-ai
ani:
/run/desktop/mnt/host/c/cursor-ai
Pokud je vidět ''/home/panhe/cursor-ai -> /home/ubuntu'', migrace se povedla.
===== Proč jsou tam dva mounty =====
Výstup může obsahovat dva bind mounty:
bind /home/panhe/cursor-ai -> /workspaces/cursor-ai
bind /home/panhe/cursor-ai -> /home/ubuntu
To znamená, že stejný WSL adresář je v kontejneru dostupný na dvou místech.
Jeden mount může vytvořit Dev Containers automaticky:
/workspaces/cursor-ai
Druhý odpovídá vlastnímu nastavení v ''devcontainer.json'':
/home/ubuntu
Pokud se pracuje podle ''workspaceFolder'' v ''/home/ubuntu'', je hlavní tento mount:
bind /home/panhe/cursor-ai -> /home/ubuntu
Není to problém, pokud všechno funguje.
===== Další ověření zevnitř kontejneru =====
V terminálu Cursoru uvnitř kontejneru spusť:
pwd
mount | grep /home/ubuntu
time git status
''pwd'' může ukázat:
/home/ubuntu
To je správně. Rozdíl není v tom, jak cesta vypadá uvnitř kontejneru. Rozdíl je v tom, odkud je ''/home/ubuntu'' namountované.
===== Přístup k WSL souborům z Windows =====
Z Windows Exploreru lze otevřít:
\\wsl.localhost\Ubuntu-24.04\home\panhe\cursor-ai
Tuto cestu lze použít pro občasné otevření, kopírování nebo kontrolu souborů z Windows.
Pro běžnou práci s projektem ale používej Cursor přes WSL a devcontainer. Nedoporučuje se dělat náročné operace jako Git, ''npm install'', ''composer install'' nebo indexaci přes Windows aplikace nad ''\\wsl.localhost''.
===== Časté chyby =====
==== Cursor se připojuje do docker-desktop-data ====
Příznak:
Resolving wsl remote authority 'wsl+docker-desktop-data'
getpwuid(0) failed
execvpe(bash) failed: No such file or directory
Význam:
Cursor se snaží použít interní Docker WSL distribuci místo Ubuntu-24.04.
Řešení:
wsl --set-default Ubuntu-24.04
Potom znovu otevři WSL okno v Cursoru.
==== Ve WSL není příkaz docker ====
Příznak:
The command 'docker' could not be found in this WSL 2 distro.
Význam:
Docker Desktop není integrovaný do této WSL distribuce.
Řešení:
Docker Desktop -> Settings -> Resources -> WSL Integration
Zapnout integraci pro default WSL distribuci nebo přímo pro ''Ubuntu-24.04''.
==== V docker inspect je pořád Windows cesta ====
Příznak:
bind /run/desktop/mnt/host/c/cursor-ai -> /home/ubuntu
nebo:
bind C:\cursor-ai -> /home/ubuntu
Význam:
Projekt je pořád otevřený z Windows filesystemu.
Řešení:
Zavřít okno Cursoru a otevřít projekt z WSL Remote okna jako:
/home/panhe/cursor-ai
ne jako:
C:\cursor-ai
===== Finální kontrolní checklist =====
Ve Windows PowerShellu:
wsl -l -v
Očekávané:
* Ubuntu-24.04 ... 2
Pokud se používá Task Scheduler se ''sleep infinity'', po restartu Windows očekávej:
Ubuntu-24.04 Running 2
Ve Windows PowerShellu ověř Docker dostupný z WSL:
wsl -d Ubuntu-24.04 -- docker ps
Očekávané:
docker příkaz projde bez chyby
Ve WSL:
pwd
Očekávané ve složce projektu:
/home/panhe/cursor-ai
Ve WSL:
docker ps -a
Očekávané:
docker příkaz funguje a jsou vidět kontejnery Docker Desktopu
Ve WSL:
docker inspect ai --format '{{range .Mounts}}{{println .Type .Source "->" .Destination}}{{end}}'
Očekávané:
bind /home/panhe/cursor-ai -> /home/ubuntu
V kontejneru:
cd /home/ubuntu
time git status
Očekávané:
git status je výrazně rychlejší než při práci nad C:\cursor-ai
===== Shrnutí =====
Funkční řešení není „připojit Cursor do kontejneru“ samo o sobě. Funkční řešení je otevřít projekt z WSL filesystemu a až potom spustit devcontainer.
Správný řetězec je:
Windows
-> Cursor Remote WSL: Ubuntu-24.04
-> otevřená složka /home/panhe/cursor-ai
-> Dev Containers rebuild
-> kontejner ai
-> /home/ubuntu bind mount z /home/panhe/cursor-ai
Data zůstávají dostupná z Windows přes:
\\wsl.localhost\Ubuntu-24.04\home\panhe\cursor-ai
a zároveň kontejner pracuje s rychlým Linux filesystemem místo pomalého Windows bind mountu.
===== Zdroje =====
* [[https://opencode.e-nosek.cz/L2hvbWUvYWl3b3JrL3NjcmF0Y2g/session/ses_0d863da33ffeZIBQ4rhReC2RYh|Pracovní OpenCode konverzace k migraci Windows devcontaineru na WSL2 filesystem]]
* [[https://docs.docker.com/desktop/features/wsl/|Docker Desktop – WSL 2 backend]]
* [[https://learn.microsoft.com/en-us/windows/wsl/install|Microsoft – instalace WSL]]
* [[https://code.visualstudio.com/docs/devcontainers/containers|Visual Studio Code Dev Containers]]