How can I change the location of docker images when using Docker Desktop on WSL2 with Windows 10 Home?

58,002

Solution 1

The WSL 2 docker-desktop-data vm disk image would normally reside in: %USERPROFILE%\AppData\Local\Docker\wsl\data\ext4.vhdx

Follow the following to relocate it to other drive/directory, with all existing docker data preserved (tested against Docker Desktop 2.3.0.4 (46911), and continued to work after updating the 3.1.0 (51484)):

First, shut down your docker desktop by right click on the Docker Desktop icon and select Quit Docker Desktop

Then, open your command prompt:

wsl --list -v

You should be able to see, make sure the STATE for both is Stopped.(wsl --shutdown)

  NAME                   STATE           VERSION
* docker-desktop         Stopped         2
  docker-desktop-data    Stopped         2

Export docker-desktop-data into a file

wsl --export docker-desktop-data "D:\Docker\wsl\data\docker-desktop-data.tar"

Unregister docker-desktop-data from wsl, note that after this, your ext4.vhdx file would automatically be removed (so back it up first if you have important existing image/container):

wsl --unregister docker-desktop-data

Import the docker-desktop-data back to wsl, but now the ext4.vhdx would reside in different drive/directory:

wsl --import docker-desktop-data "D:\Docker\wsl\data" "D:\Docker\wsl\data\docker-desktop-data.tar" --version 2

Start the Docker Desktop again and it should work

You may delete the D:\Docker\wsl\data\docker-desktop-data.tar file (NOT the ext4.vhdx file) if everything looks good for you after verifying

Solution 2

Edit: re-register docker-desktop would set the default docker-data to C drive now, so we should only unregister docker-data as the accepted answer.

You can do

 wsl --unregister docker-desktop-data

 wsl --import docker-desktop-data D:\wsl\docker-desktop-data "C:\Program Files\Docker\Docker\resources\wsl\wsl-data.tar" --version=2

The tar file is the file used to install, and before it is your new destination.

This always work while the move-wsl or lxrunoffline didn't work for me on fast rings. And sometimes you have to unistall/install docker first

Solution 3

  1. Stop Docker Desktop
  2. Relocate Docker folder from C:\Users\xxx\AppData\Local\Docker to new path
  3. Make sure C:\Users\xxx\AppData\Local\Docker is no longer there
  4. Open a cmd in administrator mode
  5. Run the following command that will create a symbolic link in the cmd window with the appropriate from and to path
    mklink /j "C:\Users\xxx\AppData\Local\Docker" "path to where you relocated your docker folder"
  1. Restart Docker Desktop

Solution 4

Extending @Attila Badi 's answer would be to also give the same treatment to the C:\ProgramData\Docker folder, which seems to be used for WSL / Windows Containers. Even moving the Docker data folders, would still leave you with a boot drive ProgramData\Docker folder of massive proportions - especially if you are unable or unwilling to clean the images. You cannot migrate it, or move it once installed. Using the Docker engine advanced settings works in Linux container mode, but not in windows and vice versa and has trouble starting.

Steps I followed:

  1. Uninstall Docker. I know... Make sure you have saved what you need.

  2. Create the primary space-eating docker folders, in a location you have a lot of space, e.g. :

    D:\Data\Docker\ProgramData_Docker & D:\Data\Docker\AppData_Local_Docker

  3. Create linked folders, by running the below in a command window in administrator mode:

mklink /j "C:\Users\xxx\AppData\Local\Docker" "D:\Data\Docker\ProgramData_Docker"
mklink /j "C:\ProgramData\Docker" "D:\Data\Docker\AppData_Local_Docker"
  1. Install Docker.

You should be able to merrily pull windows server images, but not clog up your boot drive.

Solution 5

For me docker won't start with junction.

Then I've used just directory symbolic link:

Docker stopped

Folder "wsl" moved to other location on disk "B"

RUben@AD-RUBEN C:\Users\RUben\AppData\Local\Docker
$ mklink /D wsl "B:\dev\wsl"
**symbolic link** created for wsl <<===>> B:\dev\wsl

enter image description here

Containers and Images are ready to use:

enter image description here

Share:
58,002

Related videos on Youtube

Naypa
Author by

Naypa

A Brazilian software developer trying to become a gray beard unix guru hacker. Beard. Check. Gray. Check. Unix. Check. Hacker. Check. Guru. Ops, not yet. 80% done!

Updated on November 11, 2021

Comments

  • Naypa
    Naypa over 2 years

    I've just upgraded to Windows 10 Home May 2020, activated WSL2, and installed Docker Desktop.

    WSL2 must be installed in my system disk, which is a small SSD. I don't want to fill it with docker images. How do I change the docker images path? I'd like to use a path in my big Windows filesystem.

    The image location is somewhat confusing. I believe it is in /mnt/wsl/docker-desktop-data/.

    How do I change the directory of docker images inside WSL2? May I change docker configuration to select a path inside /mnt/d, or mount a path from /mnt/d over docker data dirs?

  • otong
    otong over 3 years
    After I moved using the above script, I got an error Docker desktop WSL distro stopped. Mind to share the steps?
  • Wajahath
    Wajahath over 3 years
    Perfect! I wanted to use my HDD instead of SSD for docker images. This was what I was looking for.
  • Cyryl1972
    Cyryl1972 over 3 years
    Clear and concise
  • Danton Heuer
    Danton Heuer over 3 years
    Perfect. The only add-on I can add to this thread, is that I had just purged my cache, and I didn't had this docker-desktop-data present on listing, so I had to start Docker again and quit it in order to create the docker-desktop-data WSL distro again.
  • Julian Didier
    Julian Didier over 3 years
    Note that you will also need to shutdown wsl before exporting (I got a TimeoutException without that) : wsl --shutdown.
  • Disappointed
    Disappointed over 3 years
    I suffered from low disk space for so long ... Thank you a lot !
  • Disappointed
    Disappointed over 3 years
    But I still have a huge file C:\Users\Public\Documents\Hyper-V\Virtual hard disks\DockerDesktop.vhdx Can I delete it after ?
  • Indranil Gayen
    Indranil Gayen over 3 years
    Is there a way to do the same on new images? I mean the images which we'll pull later.
  • arnisz
    arnisz over 3 years
    Thank you! It worked for me. And for those who have a virtual machine in hyper-v-manager. It cannot belong to docker with wsl 2. It must be something from a previous version.
  • pogorman
    pogorman over 3 years
    thank you ! just saved the build server!!
  • Micah Zoltu
    Micah Zoltu about 3 years
    What, if anything, can be deleted after completing these steps and verifying results?
  • Franks CHOW
    Franks CHOW about 3 years
    Since the original %USERPROFILE%\AppData\Local\Docker\wsl\data\ext4.vhdx has already been automatically removed when you "unregister", what's left would be the docker-desktop-data.tar as mentioned in the answer.
  • Anton Krug
    Anton Krug about 3 years
    I was trying to avoid this approach but looks like from all the ones I tried this one worked for me. I think My problem is that I'm using new docker but in WSL1 setup and the 2021 answers do not apply on me. And the locations were slightly different, I did only one link here: mklink /j "C:\ProgramData\DockerDesktop" "D:\work\docker"
  • Anthony Horne
    Anthony Horne about 3 years
    @AntonKrug I am running WSL 2 on an insider windows slow ring.
  • Anton Krug
    Anton Krug about 3 years
    I'm on WIN10 LTSC which so far has only the WSL1, so then docker put things into slightly different folders and moving folders was not possible for me even when I shutdown Docker/Hyper-V. But when I uninstalled, prepared the C:\ProgramData\DockerDesktop -> D drive link then just installed Docker again then it did exactly what I wanted
  • Anthony Horne
    Anthony Horne about 3 years
    Agreed. Shutdown did nothing for me either - it still runs WSL machines in the background somewhere. Glad it worked for you. Docker should fix this and make it property part of settings (advanced even).
  • Anton Krug
    Anton Krug about 3 years
    It's ridiculous that it's not part of the regular install already, docker is not for casual consumers, yet power users often have elaborate partions/hdds setups, so I would say Docker should have this as an option for long time. Actually one of the reasons why I still use other frameworks like vagrant which feel much more solidly build and designed.
  • Redoman
    Redoman about 3 years
    In my case at the end of the procedure - after running the command for importing docker-desktop-data.tar to the new location - the WSL did not turn back on automatically (wsl --list -v was still showing results in a "stopped" state) and apparently there was no way to make WSL start again. As a result Docker Desktop could not find its image, so I tried restarting its service, which did not help either, as it was not enough to trigger WSL to turn itself back on... At last, I rebooted my system and when I restarted Docker Desktop it finally ran properly, along with WSL, and found its image...
  • Slava Shengur
    Slava Shengur about 3 years
    Awesome scripts! I wanted very much. Thank you!
  • Amin Shojaei
    Amin Shojaei over 2 years
    Also worked for windows 11
  • Sergey Dvoreckih
    Sergey Dvoreckih over 2 years
    I had problems related to 'The system cannot find the path specified.', Solved by creating directory 'D:\Docker\wsl\data' directory before procedure.
  • Yavuz Yoldaş
    Yavuz Yoldaş over 2 years
    Thank you so much bro
  • Ali Sherafat
    Ali Sherafat over 2 years
    How to clean old data in drive c to free space?
  • Neshta
    Neshta over 2 years
    It doesn't work for me. After I did these steps, Docker Desktop is endless starting.
  • Michael  Xu
    Michael Xu over 2 years
    For me I had to restart my computer but this did work!
  • djibe
    djibe almost 2 years
    FreeMove utility can do this with a GUI for the lazy ones: github.com/imDema/FreeMove