Docker-Composer des données persistantes MySQL

Je n’arrive pas à faire persister les données MySQL si je lance $ docker-compose down avec le .yml suivant

 version: '2' services: # other services data: container_name: flask_data image: mysql:latest volumes: - /var/lib/mysql command: "true" mysql: container_name: flask_mysql restart: always image: mysql:latest environment: MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this MYSQL_USER: 'test' MYSQL_PASS: 'pass' volumes_from: - data ports: - "3306:3306" 

Ma compréhension est que dans mon conteneur de data utilisant des volumes: - /var/lib/mysql mappe à mon répertoire de machines locales où mysql stocke les données dans le conteneur et à cause de cela, les données doivent persister même si les conteneurs sont détruits. Et le conteneur mysql est juste une interface cliente dans la firebase database et peut voir le répertoire local à cause de volumes_from: - data

J’ai tenté cette réponse et cela n’a pas fonctionné. Problème de données persistantes avec Docker-Compose

MODIFIER

Changé mon .yml comme indiqué ci-dessous et créé le ./data mais maintenant que je lance docker-compose up --build le conteneur mysql ne lance pas d’erreur en disant

  data: container_name: flask_data image: mysql:latest volumes: - ./data:/var/lib/mysql command: "true" mysql: container_name: flask_mysql restart: always image: mysql:latest environment: MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this MYSQL_USER: 'test' MYSQL_PASS: 'pass' volumes_from: - data ports: - "3306:3306" flask_mysql | mysqld: Can't create/write to file '/var/lib/mysql/is_writable' (Errcode: 13 - Permission denied) flask_mysql | 2016-08-26T22:29:21.182144Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). flask_mysql | 2016-08-26T22:29:21.185392Z 0 [ERROR] --initialize specified but the data directory exists and is not writable. Aborting. 

Le conteneur de données est une solution de contournement superflue. Les volumes de données feraient l’affaire pour vous. docker-compose.yml votre docker-compose.yml pour:

 version: '2' services: mysql: container_name: flask_mysql restart: always image: mysql:latest environment: MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this MYSQL_USER: 'test' MYSQL_PASS: 'pass' volumes: - my-datavolume:/var/lib/mysql volumes: my-datavolume: 

Docker créera le volume pour vous dans le dossier /var/lib/docker/volumes . Ce volume persiste tant que vous ne tapez pas docker-compose down -v

Il y a 3 façons:

Premier. Vous devez spécifier le répertoire pour stocker les données mysql sur votre machine hôte . Vous pouvez supprimer le conteneur de données. Vos données mysql seront enregistrées sur votre système de fichiers local.

Mysql définition du conteneur doit ressembler à ceci

 mysql: container_name: flask_mysql restart: always image: mysql:latest environment: MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this MYSQL_USER: 'test' MYSQL_PASS: 'pass' volumes: - /opt/mysql_data:/var/lib/mysql ports: - "3306:3306" 

La seconde manière est de valider le conteneur de données avant de taper docker-compose down :

 docker commit my_data_container docker-compose down 

Troisième voie Vous pouvez également utiliser docker-compose stop au lieu de docker-compose down (vous n’avez pas besoin de conteneur de commit)

Vous devez créer un volume distinct pour les données mysql.

Donc ça va ressembler à ceci:

 volumes_from: - data volumes: - ./mysql-data:/var/lib/mysql 

Et non, /var/lib/mysql est un chemin dans votre conteneur mysql et n’a rien à voir avec un chemin sur votre machine hôte. Votre machine hôte peut même ne pas avoir de mysql. Le but est donc de conserver un dossier interne à partir d’un conteneur mysql.

En fait, c’est le chemin et vous devriez mentionner un chemin valide pour que cela fonctionne. Si votre répertoire de données se trouve dans le répertoire courant, vous devriez ./my-data mentionner ./my-data au lieu de my-data , sinon vous obtiendrez également cette erreur dans mysql et mariadb .

 volumes: ./my-data:/var/lib/mysql