====== 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]]