PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Le volume Docker ne conserve pas les données

Il y a quelque chose qui m'a dérouté et qui pour moi n'était pas très clair dans la documentation officielle.

À ma connaissance, les volumes persistants peuvent être créés en trois manières.

  • Au conteneur heure d'appel y compris le chemin complet ( -v ~/database:/data ) :rend un dossier externe de l'hôte disponible dans le conteneur docker. Les deux peuvent le modifier.
  • Au conteneur heure d'appel en utilisant un nom de volume ( -v datamysql:/data ) :rend disponible un volume persistant à l'intérieur du conteneur. On le crée s'il n'existait pas. Vous pouvez les lister par nom avec docker volume ls . En interne, il sera stocké dans un endroit tel que /var/lib/docker/volumes/ae4445f7c9317a22fe84726fb894c47754f38a7fd150c00fd877024889968750/_data .
  • Au conteneur au moment de la construction ( VOLUME ["/database/data"] dans Dockerfile). Chaque invocation de docker run créera un nouveau volume qui persistera même si vous supprimez le conteneur. Cela peut prêter à confusion car les appels ultérieurs entraîneront des résultats différents volumes en cours de création qui ne seront pas réutilisés.

Vous pouvez répertorier les volumes nommés (deuxième cas) et sans nom (troisième cas) avec

$ docker volume ls                                                             
DRIVER              VOLUME NAME                                                             
local               064593b3e65977097d4d0c8402a6c633f1af69be2937bf118678ab8f97ee9a7e               
local               4753ad0437d13e54c76d9c34a30a1843396a1866a0cf9237d500fdcca0d78c5f           
local               8d7a35354f666b2e8a26866a35bbae36bb9601701d4c6b505ab8ce6629f69415               
local               db48eefe8f189b36107ca9c4eebb792690590ab0ba055e7e4e2c9adfd1765b7e                    
local               datamysql

Vous pouvez voir l'emplacement exact du volume d'un conteneur en utilisant docker inspect mycontainer

{
                "Type": "volume",
                "Name": "8d7a35354f666b2e8a26866a35bbae36bb9601701d4c6b505ab8ce6629f69415",
                "Source": "/media/USBdrive/docker/volumes/8d7a35354f666b2e8a26866a35bbae36bb9601701d4c6b505ab8ce6629f69415/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },

Il peut être utile de supprimer les volumes inutilisés (pour le troisième cas, en particulier).

$ docker volume prune
WARNING! This will remove all volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
4753ad0437d13e54c76d9c34a30a1843396a1866a0cf9237d500fdcca0d78c5f

Total reclaimed space: 205MB

Parce que vous avez utilisé le VOLUME directive dans votre Dockerfile, vous êtes dans le troisième cas. Inspectez votre conteneur pour rechercher le fichier et spécifiez le volume à partir de la ligne de commande si vous souhaitez que les sessions répétées conservent les données.