How to change the docker image installation directory?

Go To StackoverFlow.com

150

From what I can tell, docker images are installed to /var/lib/docker as they are pulled. Is there a way to change this location, such as to a mounted volume like /mnt?

2014-06-19 14:49
by Michael Barton
which operating system is your docker running on - Thomasleveil 2014-06-19 16:14


117

With recent versions of Docker, you would set the value of the graph parameter to your custom path, in /etc/docker/daemon.json (according to https://docs.docker.com/v1.11/engine/reference/commandline/daemon/#daemon-configuration-file).

With older versions, you can change Docker's storage base directory (where container and images go) using the -goption when starting the Docker daemon. (check docker --help). You can have this setting applied automatically when Docker starts by adding it to /etc/default/docker

2014-06-19 16:51
by mbarthelemy
Thanks for your answer. Could you tell me the how to add this requirement in the docker upstart file? Is the case that I add the -g flag to the DOCKER_OPTS variable - Michael Barton 2014-06-23 14:29
I think the best solution is to add this -goption to /etc/defaults/docker instead of modifying the Upstart file, see my answer - mbarthelemy 2014-06-23 14:37
Sorry for the confusion, that was the file I was referring to. In '/etc/defaults/docker.io' there is a line 'DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4"'. Is that the option I should use to set the graph directory with the -g flag - Michael Barton 2014-06-23 15:04
Yes, change this line to DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"mbarthelemy 2014-06-23 17:05
Doesn't work in Fedora. See my answer if your distro is Fedor - Vitor 2014-11-27 11:19
You might need to implement this solution to a bug in some versions of Debian or Ubuntu if docker ignores your /etc/default/docker file - nedim 2015-07-03 13:58
if you only want to change this setting only change to: DOCKER_OPTS="-g /mnt" ommit the -dns parameter - HackerBaloo 2015-10-16 05:06
Thanks. This worked fine. The problem is I get this error when downloading new images:

"failed to register layer: Untar re-exec error: exit status 1: output: link /bin/dnsdomainname /bin/domainname: operation not permitted"

Any ideas - chosenbreed37 2016-05-06 18:34

Setting this flag in /etc/default/docker is not recommended. There is a comment in the /etc/default/docker file pointing to this guideline - ivandov 2017-02-07 18:23
Where is documented the -g option? I didn't find on the dockerd man page - Manoel Vilela 2017-10-09 18:10
@ManoelVilela That's for old Docker releases - my initial answer was written 3 years ago ; - mbarthelemy 2017-10-10 04:05
It's still working on 17.09.0-ce, but I didn't find yet any docs about that - Manoel Vilela 2017-10-10 16:54
The graph attribute in daemon.json is deprecated as of v17.05.0, use data-root instead, cf. https://stackoverflow.com/a/50217666/74350 - dschulten 2019-01-25 08:04


120

Following advice from comments I utilize Docker systemd documentation to improve this answer. Below procedure doesn't require reboot and is much cleaner.

First create directory and file for custom configuration:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo $EDITOR /etc/systemd/system/docker.service.d/docker-storage.conf

For docker version before 17.06-ce paste:

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --graph="/mnt"

For docker after 17.06-ce paste:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --data-root="/mnt"

Alternative method through daemon.json

I recently tried above procedure with 17.09-ce on Fedora 25 and it seem to not work. Instead of that simple modification in /etc/docker/daemon.json do the trick:

{
    "graph": "/mnt",
    "storage-driver": "overlay"
}

Despite the method you have to reload configuration and restart Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

To confirm that Docker was reconfigured:

docker info|grep "loop file"

In recent version (17.03) different command is required:

docker info|grep "Docker Root Dir"

Output should look like this:

 Data loop file: /mnt/devicemapper/devicemapper/data
 Metadata loop file: /mnt/devicemapper/devicemapper/metadata

Or:

 Docker Root Dir: /mnt

Then you can safely remove old Docker storage:

rm -rf /var/lib/docker
2016-01-11 21:35
by Piotr Król
This worked well for me on Debian 8.4 - Girish KG 2016-04-18 09:39
It's only method which helped me on Ubuntu 16.04 - Vadim 2016-05-05 12:04
This link https://docs.docker.com/engine/admin/systemd/ explains how to configure Docker with systemd, which works for newer linux distribution such as Ubuntu 16.04 - Joseph Hui 2016-06-26 10:43
The docker info statement is probably outdated. On Ubuntu 16.04, the check for reconfigured is sudo docker info | grep "Docker Root Dir". Otherwise, good answer, should be the accepted one ; - Guillaume Perrot 2016-08-04 01:34
@GuillaumePerrot I just tested on Debian Sid with Docker 1.12.0 and still have Data loop file and Metadata loop file. Apparently on Ubuntu you have different version - Piotr Król 2016-08-15 19:14
It worked for some time, but from some time I receive an error during starting the docker service: Error starting daemon: error initializing graphdriver: invalid argument (see https://github.com/docker/docker/issues/14026). After deleting /etc/systemd/system/docker.service.d/docker-storage.conf everything is OK. Probable reason was upgrading the kernel I did in the meantime - TOUDIdel 2016-09-26 20:14
Confirmed working May 26th, 2017 on Xubuntu 16.04 LTS with Docker version 17.03.1-ce, build c6d412e - Yngvar Kristiansen 2017-05-26 07:53
On debian, the file to edit seems to be /lib/systemd/system/docker.service (see https://linuxconfig.org/how-to-move-docker-s-default-var-lib-docker-to-another-directory-on-ubuntu-debian-linux) - head7 2017-06-16 04:28
In new version of Linux (4.10) and Docker (docker-ce 17.06) the line must be changed as follows:

/usr/bin/dockerd -H fd:// --data-root="/mnt - lorenzo-bettini 2017-06-30 14:21

@lorenzo-bettini this is change in Docker. Kernel version is not related with that. Anyway thanks for the hint - Piotr Król 2017-07-01 12:18
be careful if you also have a docker.conf in /etc/systemd/system/docker.service.d/Belun 2017-09-04 11:46
If you see Docker Root Dir: /"/mnt" when you runs docker info|grep "Docker Root Dir", you have to replace --data-root="/mnt" into --data-root=/mnt inside the file docker-storage.confSer 2017-09-12 00:45
Note that the new storage location should not be an NTFS partition, see here, if you do want that use the vfs driver, but see mentioned thread for caveats - Adversus 2018-05-24 07:14
thanks, it works - Николай Мишин 2018-10-22 13:51


35

Since I haven't found the correct instructions for doing this in Fedora (EDIT: people pointed in comments that this should also work on CentOS and Suse) (/etc/default/docker isn't used there), I'm adding my answer here:

You have to edit /etc/sysconfig/docker, and add the -g option in the OPTIONS variable. If there's more than one option, make sure you enclose them in "". In my case, that file contained:

OPTIONS=--selinux-enabled

so it would become

OPTIONS="--selinux-enabled -g /mnt"

After a restart (systemctl restart docker) , Docker should use the new directory

2014-11-27 11:18
by Vitor
On CentOS 6.5/6.6 and probably 7, you use the same /etc/sysconfig/docker file, but you add the arguments to the variable name other_args - dlaidlaw 2015-01-08 18:11
On CentOS 7 this works to - ItalyPaleAle 2015-06-03 15:51
The option is called DOCKER_OPTS now (docker version 1.7.0) - nedim 2015-07-03 13:55
This works for OpenSuse too - Arturo Volpe 2015-07-27 19:01
From version 1.8 of Docker onward, using the Docker configuration files in /etc/sysconfig is deprecated. Instead, you should use systemd drop-in configuration files in etc/systemd/system/docker.service.d.

After adding or modifying a drop-in file while the docker service is running, run the command systemctl daemon-reload to tell systemd to reload the configuration for the service. https://docs.oracle.com/cd/E5266801/E54669/html/sectionkfyf2zfp.htm - Pablo Marin-Garcia 2015-11-16 00:34

and use drop-in files http://docs.docker.com/engine/articles/systemd/#custom-docker-daemon-option - Pablo Marin-Garcia 2015-11-16 00:40
working fine on fedora 26 thanks - NoName 2017-07-19 20:40


22

Don't use a symbolic Link to move the docker folder to /mnt (for example). This may cause in trouble with the docker rm command.

Better use the -g Option for docker. On Ubuntu you can set it permanently in /etc/default/docker.io. Enhance or replace the DOCKER_OPTS Line.

Here an example: `DOCKER_OPTS="-g /mnt/somewhere/else/docker/"

2015-01-14 18:50
by suther
in my case i had to restar - psychok7 2015-08-27 20:48
What kind of trouble do I have to expect with docker rm when using a symlink - bjhend 2016-02-08 16:07
this method does not work for me on Ubuntu 16.04psychok7 2016-05-06 10:38
I also had to do this in Ubuntu 16.04 http://stackoverflow.com/a/30219552/977622 to get it to wor - psychok7 2016-05-06 10:55


15

For new docker versions we need to use data-root as from the official deprecated docs (Deprecated In Release: v17.05.0)

{
  "data-root": "/new/path/to/docker-data"
}
  • Changing Docker Storage with data-root: my most helpful Post with steps to follow
  • In case of Windows a similar post Windows specific
2018-05-07 15:27
by andreas-supersmart
your comment helped me find this page: https://adriel.co.nz/blog/2018/01/25/change-docker-data-directory-in-debian-jessie/

thanks - nasatome 2018-08-25 23:55

I think it's time to give this answer the "accepted" flag, because it's working in the current version - The Bndr 2019-02-14 09:52


11

In CentOS 6.5

service docker stop
mkdir /data/docker  (new directory)
vi /etc/sysconfig/docker

add following line

other_args=" -g /data/docker -p /var/run/docker.pid"

then save the file and start docker again

service docker start

and will make repository file in /data/docker

2015-03-12 05:59
by sean kim


11

This solution works on Red Hat 7.2 & Docker 1.12.0

Edit the file /lib/systemd/system/docker.service in your text editor.

add -g /path/to/docker/ at the end of ExecStart directive. The complete line should look like this.

ExecStart=/usr/bin/dockerd -g /path/to/docker/

Execute the below command

systemctl daemon-reload
systemctl restart docker

Execute the command to check docker directory

docker info | grep "loop file\|Dir"

If you have /etc/sysconfig/docker file in Red Hat or docker 1.7.1 check this answer.

2016-08-17 10:18
by Sudeepta
my case: centos7, latest docker; i had to call "systemctl status docker" to find the "docker.service" file and added the option "-g" like in the answer. Thank - datdinhquoc 2018-07-09 07:06


11

Copy-and-paste version of the winner answer :)

Create this file with only this content:

$ sudo vi /etc/docker/daemon.json

  {
      "graph": "/my-docker-images"
  }

Tested on Ubuntu 16.04.2 LTS in docker 1.12.6

2017-06-22 21:53
by Topera
works on Ubuntu 16.04.2 LTS for me to - Noureddine AMRI 2018-01-21 12:40
The graph attribute in daemon.json is deprecated as of v17.05.0, use data-root instead, cf. https://stackoverflow.com/a/50217666/74350 - dschulten 2019-01-25 08:07


6

For Debian/Ubuntu or Fedora, you can probably use the other answers. But if you don't have files under /etc/default/docker or /etc/sysconfig/docker, and your system is running systemd, you may want to follow this answer by h3nrik. I am using Arch, and this works for me.

Basically, you need to configure systemd to read the new docker image location as an environment variable, and pass that environment variable into the Docker daemon execution script.

For completeness, here is h3nrick's answer:


Do you have a /lib/systemd/system/docker.service file?

If so, edit it so that the Docker service uses the usual /etc/default/docker as an environment file: EnvironmentFile=-/etc/default/docker.

In the /etc/default/docker file then add DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images".

At the end just do a systemctl daemon-reload && systemctl restart docker.

For further information please also have a look at the documentation.

2015-09-23 05:47
by modulitos
thanks for mentioning docker.service references - Kai Wang 2015-10-17 20:54
If you follow current docker install instructions for Debian, you get SysVinit scripts but they aren't used. See https://github.com/docker/docker/issues/9889#issuecomment-10976658 - Simon Woodside 2017-02-12 04:57


4

A much simpler solution is to create a soft link point to whatever you want, such as

link -s /var/lib/docker /mnt/whatever

It works for me on my CentOS 6.5 server.

2014-12-17 17:39
by liuyanghejerry
Don't create a softlink. Reasons see my comment I post before... You may run in trouble with 'docker rm' commands - suther 2015-03-30 07:59
@suther: May? Now is there a situation you run into trouble or not? May is a bit imprecise for technical documentation, if I run into a problem then I want to learn when exactly that happens, how that problem is caused and how the outcome would be - hakre 2016-07-29 05:18


4

As recommneded by @mbarthelemy this can be done via the -g option when starting the docker daemon directly.

However, if docker is being started as a system service, it is not recommended to modify the /etc/default/docker file. There is a guideline to this located here.

The correct approach is to create an /etc/docker/daemon.json file on Linux (or Mac) systems or %programdata%\docker\config\daemon.json on Windows. If this file is not being used for anything else, the following fields should suffice:

{
    "graph": "/docker/daemon_files"
}

This is assuming the new location where you want to have docker persist its data is /docker/daemon_files

2017-02-07 18:29
by ivandov


2

Much easier way to do so:

Stop docker service

sudo systemctl stop docker

Move existing docker directory to new location

sudo mv /var/lib/docker/ /path/to/new/docker/

Create symbolic link

sudo ln -s /path/to/new/docker/ /var/lib/docker/

Start docker service

sudo systemctl start docker
2018-04-09 23:49
by fnjn
This is IMO the right and the most straightforward solution - worked for me - Martin Dvorak 2018-10-03 19:56


1

On an AWS Ubuntu 16.04 Server I put the Docker images on a separate EBS, mounted on /home/ubuntu/kaggle/, under the docker dir

This snippet of my initialization script worked correctly

# where are the images initially stored?
sudo docker info | grep "Root Dir"
# ... not where I want them

# modify the configuration files to change to image location
# NOTE this generates an error
# WARNING: Usage of loopback devices is strongly discouraged for production use.
#          Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
# see https://stackoverflow.com/questions/31620825/
#     warning-of-usage-of-loopback-devices-is-strongly-discouraged-for-production-use

sudo sed -i   ' s@#DOCKER_OPTS=.*@DOCKER_OPTS="-g /home/ubuntu/kaggle/docker"@ '  /etc/default/docker

sudo chmod -R ugo+rw /lib/systemd/system/docker.service
sudo cp  /lib/systemd/system/docker.service /etc/systemd/system/
sudo chmod -R ugo+rw /etc/systemd/system/

sudo sed -i ' s@ExecStart.*@ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://@ '  /etc/systemd/system/docker.service
sudo sed -i '/ExecStart/a EnvironmentFile=-/etc/default/docker' /etc/systemd/system/docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info | grep "Root Dir"
# now they're where I want them
2016-12-17 16:43
by George Fisher


1

On openSUSE Leap 42.1

$cat /etc/sysconfig/docker 
## Path           : System/Management
## Description    : Extra cli switches for docker daemon
## Type           : string
## Default        : ""
## ServiceRestart : docker
#
DOCKER_OPTS="-g /media/data/installed/docker"

Note that DOCKER_OPTS was initially empty and all I did was add in the argument to make docker use my new directory

2017-01-12 07:49
by Mahlatse Makalancheche


1

On Fedora 26 and probably many other versions, you may encounter an error after moving your base folder location as described above. This is particularly true if you are moving it to somewhere under /home. This is because SeLinux kicks in and prevents the docker container from running many of its programs from under this location.

The short solution is to remove the --enable-selinux option when you add the -g parameter.

2017-10-11 02:43
by Euan


0

For Mac users in the 17.06.0-ce-mac19 version you can simply move the Disk Image location from the user interface in the preferences option Just change the location of the disk image and it will work (by clicking Move disk Image) and restarting the docker. Using this approach I was able to use my external hardisk for storing docker images.

2017-07-27 20:45
by sahu
Ads