# Change docker root on Ubuntu 因為 Docker 的資料很佔空間,預設的位置空間不太夠,需要把相關資料都移到另外一個位置,所以把搬運過程記錄下來。[^1] [^1]: [Change Docker Root, Github: IronicBadger/til](https://github.com/IronicBadger/til/blob/master/docker/change-docker-root.md) ## Change Root Dir ### Check root dir ```shell $ docker info ... Root Dir: /var/lib/docker ``` ### Check systemd ```shell $ systemctl status docker ... Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) ``` 可以看到 systemd 是從哪個 config 檔案開啟 docker 服務。比如上面就是 `/lib/systemd/system/docker.service`。 那麼,啟動 dockerd 自訂的 config 就應該放在 `/lib/systemd/system/docker.service.d/docker.root.conf` ### Modify config 確認 `docker.service.d/docker.root.conf` 或 `docker.service`: ```ini [Service] ExecStart=/usr/bin/docker -H fd:// ``` 在 `docker.root.conf` 裡,修改 `ExecStart`,在原本的指令下加上 argument: `-g /new/docker/root` :::warning 不應該直接改 `docker.service`,因為這個檔案是程式自動生成,只要更新 docker 就會被改掉。`docker.service.d/docker.root.conf` 是不會隨著更新消失的 user config,如果原本沒有就建一個。 ::: 所以修改後 `docker.root.conf` 大概會長得像這樣: ```ini [Service] ExecStart=/usr/bin/docker -g /new/docker/root -H fd:// ``` ## Move files 改完 root dir 之後應該會需要把之前 root dir 裡的檔案都移到新的 root dir,可以用 `rsync`: ```shell rsync -a /var/lib/docker/* /path/to/new/root ``` `-a` 的意思是原封不動的複製過去,包括 permission、create time、modified time 等等。都複製完之後就可以 `rm -r /var/lib/docker` 把他刪掉了。 ## Restart Deamon 改好 config 之後要重開 deamon 才會生效。 ```shell $ systemctl daemon-reload $ systemctl restart docker $ docker info ... Root Dir: /path/to/new/root ``` ## Problem: failed to update store for object type libnetwork.network 重開 docker 後要起 container 遇到 `failed to update store for object type libnetwork.network`,解法如下(似乎 private networks 都會被刪掉,需要再一一重開):[^2] ```shell rm /var/lib/docker/network/files/* systemctl restart docker ``` [^2]: [Issue: failed to update store for object type *libnetwork.network: json: cannot unmarshal bool into Go value of type string, Github: moby/moby](https://github.com/moby/moby/issues/20869#issuecomment-273013761)