Je me rends compte que d'autres personnes ont eu des questions similaires, mais cela utilise le format de fichier v2 compose et je n'ai rien trouvé pour cela.
Je veux créer une application de test très simple pour jouer avec MemSQL mais je ne peux pas obtenir de volumes à ne pas supprimer après docker-compose down
. Si j'ai bien compris Docker Docs, les volumes ne doivent pas être supprimés sans le dire explicitement à. Tout semble fonctionner avec docker-compose up
mais après avoir redescendu puis remonté toutes les données sont supprimées de la base de données.
Comme recommandé comme bonne pratique, j'utilise un service memsqldata séparé en tant que couche de données distincte.
Voici mon docker-compose.yml:
version: '2'
services:
app:
build: .
links:
- memsql
memsql:
image: memsql/quickstart
volumes_from:
- memsqldata
ports:
- "3306:3306"
- "9000:9000"
memsqldata:
image: memsql/quickstart
command: /bin/true
volumes:
- memsqldatavolume:/data
volumes:
memsqldatavolume:
driver: local
Cela remonte à une mauvaise documentation de MemSQL. Chemin de données MemSQL dans memsql/quickstart
le conteneur est /memsql
et pas /var/lib/memsql
comme dans une installation autonome (et dans les documents MemSQL), et certainement pas /data
comme quelqu'un me l'a dit.
Je me rends compte que c'est un vieux thread résolu où l'OP pointait vers un répertoire dans le conteneur plutôt que le volume qu'ils avaient monté, mais je voulais clarifier certaines des informations erronées que je vois.
docker-compose down
ne supprime pas les volumes, vous devez exécuter docker-compose down -v
si vous souhaitez également supprimer des volumes. Voici le texte d'aide directement de docker-compose (notez la liste "par défaut"):
$ docker-compose down --help
Stops containers and removes containers, networks, volumes, and images
created by `up`.
By default, the only things removed are:
- Containers for services defined in the Compose file
- Networks defined in the `networks` section of the Compose file
- The default network, if one is used
Networks and volumes defined as `external` are never removed.
Usage: down [options]
Options:
...
-v, --volumes Remove named volumes declared in the `volumes` section
of the Compose file and anonymous volumes
attached to containers.
...
$ docker-compose --version
docker-compose version 1.12.0, build b31ff33
Voici un exemple de yml avec un volume nommé à tester et une commande factice:
$ cat docker-compose.vol-named.yml
version: '2'
volumes:
data:
services:
test:
image: busybox
command: tail -f /dev/null
volumes:
- data:/data
$ docker-compose -f docker-compose.vol-named.yml up -d
Creating volume "test_data" with default driver
Creating test_test_1
Après avoir démarré le conteneur, le volume est initialisé vide car l'image est vide à cet endroit. J'ai créé un rapide monde bonjour à cet endroit:
$ docker exec -it test_test_1 /bin/sh
/ # ls -al /data
total 8
drwxr-xr-x 2 root root 4096 May 23 01:24 .
drwxr-xr-x 1 root root 4096 May 23 01:24 ..
/ # echo "hello volume" >/data/hello.txt
/ # ls -al /data
total 12
drwxr-xr-x 2 root root 4096 May 23 01:24 .
drwxr-xr-x 1 root root 4096 May 23 01:24 ..
-rw-r--r-- 1 root root 13 May 23 01:24 hello.txt
/ # cat /data/hello.txt
hello volume
/ # exit
Le volume est visible en dehors de docker et est toujours là après un docker-compose down
:
$ docker volume ls | grep test_
local test_data
$ docker-compose -f docker-compose.vol-named.yml down
Stopping test_test_1 ... done
Removing test_test_1 ... done
Removing network test_default
$ docker volume ls | grep test_
local test_data
La recréation du conteneur utilise l'ancien volume avec le fichier toujours visible à l'intérieur:
$ docker-compose -f docker-compose.vol-named.yml up -d
Creating network "test_default" with the default driver
Creating test_test_1
$ docker exec -it test_test_1 /bin/sh
/ # cat /data/hello.txt
hello volume
/ # exit
Et en exécutant un docker-compose down -v
supprime enfin le conteneur et le volume:
$ docker-compose -f docker-compose.vol-named.yml down -v
Stopping test_test_1 ... done
Removing test_test_1 ... done
Removing network test_default
Removing volume test_data
$ docker volume ls | grep test_
$
Si vous constatez que vos données ne sont conservées que si vous utilisez un arrêt/démarrage plutôt qu'un arrêt/montée, vos données sont stockées dans le conteneur (ou éventuellement un volume anonyme) plutôt que dans votre volume nommé, et le conteneur n'est pas persistant. Assurez-vous que l'emplacement de vos données à l'intérieur du conteneur est correct pour éviter cela.
Pour déboguer l'emplacement de stockage des données dans votre conteneur, je vous recommande d'utiliser docker diff
sur un conteneur. Cela montrera tous les fichiers créés, modifiés ou supprimés à l'intérieur de ce conteneur qui seront perdus lorsque le conteneur est supprimé. Par exemple.:
$ docker run --name test-diff busybox \
/bin/sh -c "echo hello docker >/etc/hello.conf"
$ docker diff test-diff
C /etc
A /etc/hello.conf
Je ne sais pas si cela aide ou non. Lorsque vous utilisez docker-compose up -d
le conteneur est téléchargé et les images créées. Pour arrêter les images du docker, utilisez docker-compose down
, et les images resteront et pourront être redémarrées avec docker-compose start
J'utilisais les commandes haut/bas et j'ai continué à perdre mes données jusqu'à ce que j'essaie d'arrêter/démarrer et maintenant les données persistent.
Vous utilisez docker-compose down
et si vous regardez les documents ici
Arrêtez les conteneurs et supprimez les conteneurs, réseaux, volumes et images créés par
up
. Seuls les conteneurs et les réseaux sont supprimés par défaut.
Vous avez raison, il ne faut pas supprimer les volumes (par défaut). Il peut s'agir d'un bogue ou vous avez peut-être modifié la configuration par défaut. Mais je pense que la bonne commande pour vous est docker-compose stop
. Je vais essayer de faire quelques tests avec des cas plus simples pour la commande down
.
La solution la plus simple consiste à utiliser docker-compose stop
au lieu de docker-compose down
. Puis docker-compose start
recommencer.
Selon docs , down
"arrête les conteneurs et supprime les conteneurs, réseaux, volumes et images créés par up."