Je n'arrive pas à faire en sorte que les données MySQL persistent si j'exécute $ 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"
Si j'ai bien compris, dans mon conteneur data
, volumes: - /var/lib/mysql
le mappe sur le répertoire de mon ordinateur local où mysql stocke les données dans le conteneur. Par conséquent, les données doivent persister même si les conteneurs sont détruits. Et le conteneur mysql
est simplement une interface client dans la base de données et peut voir le répertoire local à cause de volumes_from: - data
Tentative de cette réponse et cela n'a pas fonctionné. Problème de données persistantes avec Docker-Compose
EDIT
Modification de mon .yml
comme indiqué ci-dessous et création du répertoire ./data
, mais lorsque je lance le docker-compose up --build
, le conteneur mysql
ne démarre pas et génère une erreur.
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. Data-volumes ferait l'affaire pour vous. Modifiez votre docker-compose.yml
en:
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:
première manière
Vous devez spécifier le répertoire dans lequel stocker les données mysql sur votre machine hôte. Vous pouvez ensuite supprimer le conteneur de données. Vos données mysql seront sauvegardées sur votre système de fichiers local.
La définition du conteneur Mysql 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"
Deuxième manière
Serait à 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 aussi utiliser docker-compose stop
au lieu de docker-compose down
(vous n'avez pas besoin de valider le conteneur).
Vous devez créer un volume séparé pour les données mysql.
Donc ça va ressembler à ça:
volumes_from:
- data
volumes:
- ./mysql-data:/var/lib/mysql
Et non, /var/lib/mysql
est un chemin d'accès dans votre conteneur mysql et n'a rien à voir avec un chemin d'accès sur votre ordinateur hôte. Votre machine hôte peut même ne pas avoir du tout mysql. L'objectif est donc de conserver un dossier interne à partir d'un conteneur mysql.
En fait, c’est le chemin et vous devez mentionner un chemin valide pour que cela fonctionne. Si votre répertoire de données est dans le répertoire en cours, alors au lieu de my-data
, vous devez mentionner ./my-data
, sinon vous obtiendrez également cette erreur dans mysql
et mariadb
.
volumes:
./my-data:/var/lib/mysql