Déplacer le dossier de données (data-root) de docker

Pour déplacer le dossier de données de docker, ne suffit pas :

  • d'arrêter docker
  • de déplacer le dossier
  • de mettre à jour la configuration du démon et redémarrer

Si on s'arrête là il est très probable qu'il ne soit pas possible de redémarrer les conteneurs docker.

Le symptome est visible dans les logs (via journalctl -u docker par exemple).

Chaque conteneur a une configuration dans un fichier config.v2.json (typiquement à l'emplacement <dossier data-root>/<container_id>/config.v2.json). Ce fichier de configuration peut spécifier des chemins absolus qui utilisaient l'ancien emplacement du dossier de données.

L'erreur typique, que l'on peut voir (avec journalctl -u docker) après avoir redémarrer le démon et les conteneurs est :

error evaluating symlinks from mount source "/var/lib/docker/volumes/mycontainer/_data": lstat /var/lib/docker: no such file or directory

  • Arrêter les services :
sudo systemctl stop docker
sudo systemctl stop docker.socket
sudo systemctl stop containerd
  • Copier ou déplacer le dossier vers la nouvelle destination
mv /var/lib/docker /my/new/destination
  • Mettre à jour le fichier de configuration du démon docker (/etc/docker/daemon.json) :
{
  "data-root": "/my/new/destination"
}
  • Mettre à jour la configuration des conteneurs pour remplacer l'ancien chemin avec le nouveau (chemin pouvant être mentionné dans les chemins des volumes, par exemple) :
find /my/new/destination -name config.v2.json -exec sed -i 's|/var/lib/docker|/my/new/destination|g' {} \;
  • Redémarrer les services
sudo systemctl start containerd
sudo systemctl start docker.socket
sudo systemctl start docker