web-dev-qa-db-fra.com

Comment rendre les volumes permanents avec Docker Compose v2

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
17
jimmy

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.

4
jimmy

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
25
BMitch

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.

2
Bobby McGill

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.

2
Adrien Chaussende

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."

2
Jonathan Stray