Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Docker volumes on WSL2 using Docker Desktop

I'm just trying out WSL 2 with Docker for Windows and I'm having an issues with mounted volumes :

version: "3.7"

services:
    node:
        build: .
        container_name: node
        hostname: node
        volumes: 
            - ./app:/app
        stdin_open: true

the container build and start well, I access it with docker exec nicely but the /app folder inside the container isn't bound to my laptop app folder. However the right path is actually correctly mounted on the running container :

(here I do pwd on the host to if it matches perfectly with what is mounted on the container)

➜  app pwd   
/mnt/c/Users/willi/devspace/these/app

And this is screen of portainer telling me what path are mounted where in the container and everything matches.

docker volume from portainer

The file I create int he app folder on the host are not visible in the app folder of the container and vice-versa. This is weird and I don't know how to debug it.

Complementary infos:

  • Windows 10 Pro 10.0.19041
  • Docker for Windows version : 2.3.0.4
  • docker version output in WSL : 19.03.12
  • docker-compose version : 1.26.2

Thanks

like image 902
NeitoFR Avatar asked Aug 23 '20 21:08

NeitoFR


2 Answers

Everything works perfectly now, it seems that my problem was that my WSL distro was still in version 1. You can verify it with the command : wsl -l -v

  NAME                   STATE           VERSION
* docker-desktop-data    Stopped         2
  docker-desktop         Stopped         2
  Ubuntu-20.04           Running         2 <- This was at 1

Upgrade to WSL2

like image 192
NeitoFR Avatar answered Nov 15 '22 02:11

NeitoFR


As @Pablo mentioned, the Best-Practice seems to be using WSL File system for mapping Volumes.

Take a look at the Docker Documentation concerning WSL2:

Best practices

  1. To get the best out of the file system performance when bind-mounting files:
    • Store source code and other data that is bind-mounted into Linux containers (i.e., with docker run -v <host-path>:<container-path>) in the Linux filesystem, rather than the Windows filesystem.
    • Linux containers only receive file change events (“inotify events”) if the original files are stored in the Linux filesystem.
    • Performance is much higher when files are bind-mounted from the Linux filesystem, rather than remoted from the Windows host. Therefore avoid docker run -v /mnt/c/users:/users (where /mnt/c is mounted from Windows).
    • Instead, from a Linux shell use a command like docker run -v ~/my-project:/sources <my-image> where ~ is expanded by the Linux shell to $HOME.
  2. If you have concerns about the size of the docker-desktop-data VHDX, or need to change it, take a look at the WSL tooling built into Windows.
  3. If you have concerns about CPU or memory usage, you can configure limits on the memory, CPU, Swap size allocated to the WSL 2 utility VM.
  4. To avoid any potential conflicts with using WSL 2 on Docker Desktop, you must uninstall any previous versions of Docker Engine and CLI installed directly through Linux distributions before installing Docker Desktop.
like image 21
skydivin4ng3l Avatar answered Nov 15 '22 01:11

skydivin4ng3l