简体   繁体   中英

Docker Bind Mounts in WSL do not show files

Im trying to use the docker client from inside WSL, connecting to the docker engine on Windows. Ive exposed the docker engine on Windows on port 2375, and after setting the DOCKER_HOST environment variable in WSL, I can verify this works by running docker ps.

The problem comes when i attempt to mount directories into docker containers from WSL. For example:

  • I create a directory and file inside my home folder on WSL ( mkdir ~/dockertest && touch ~/dockertest/example.txt )
  • ls ~/dockertest shows my file has been created
  • I now start a docker container, mounting my docker test folder ( docker run -it --rm -v ~/dockertest:/data alpine ls /data )
  • I would expect to see 'example.txt' in the docker container, but this does not seem to be happening.

Any ideas what I might be missing?

There are great instructions for Docker setup in WSL at https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly#ensure-volume-mounts-work - solved most of my problems. The biggest trick for me was with bind-mounted directories; you have to use a path in WSL that the Docker daemon will be able to translate, for example /c/Users/rfay/myproject.

I don't think you need to change the mound point as the link suggests. Rather if you use pwd and sed in combination you should get the effect you need.

docker run -it -v $(pwd | sed 's/^\\/mnt//'):/var/folder -w "/var/folder" alpine

pwd returns the working folder in the format '/mnt/c/code/folder'. Pipe this to sed and replace '/mnt' with empty string will leave you with a path such as '/c/code/folder' which is correct for docker for windows.

Anyone stumbling here over this issue follow this: Docker Desktop WSL2 Backend and make sure you are running the version 2 of the WSL in PowerShell:

> wsl -l -v
  NAME                   STATE           VERSION
* docker-desktop         Running         2
  Ubuntu                 Running         2
  docker-desktop-data    Running         2

If your Ubuntu VERSION doesn't say 2, you need to update it according to the guide above.

After that, you will be able to mount your Linux directory to the Docker Container directly like:

docker run -v ~/my-project:/sources <my-image>

Specific to WSL 1 Ran into the same issue. One thing to remember is that docker run command does not execute a container then and there on a command shell. It sends the run arguments to a docker daemon that does not interpret WSL path correctly. Hence, you need to pass Windows formatted path in quotes and with back slashes escaped

Your Windows path is

\\wsl$\Ubuntu\home\username\dockertest

Docker command after escaping will probably be like

docker run -it --rm -v "\\\\wsl\$\\Ubuntu\\home\\username\\dockertest":/data alpine ls /data

try

 docker -v /:{path} exe

Hope to help you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM