Je n'arrive pas à faire en sorte que les données MySQL persistent si je cours $ docker-compose down
avec ce qui suit.yml
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 data
conteneur, l'utilisation de volumes: - /var/lib/mysql
mappe vers mon répertoire de machines locales où mysql stocke les données dans le conteneur et à cause de ce mappage, les données devraient persister même si les conteneurs sont détruits. Et le mysql
conteneur n'est qu'une interface client dans la base de données et peut voir le répertoire local en raison devolumes_from: - data
J'ai tenté cette réponse et cela n'a pas fonctionné. Problème de données persistantes Docker-Compose
ÉDITER
J'ai changé mon .yml
comme indiqué ci-dessous et créé un répertoire, ./data
mais maintenant, lorsque j'exécute docker-compose up --build
le mysql
conteneur, ne démarre pas, une 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.
Réponses:
Le conteneur de données est une solution de contournement superflue. Les volumes de données feraient l'affaire pour vous. Modifiez votre
docker-compose.yml
:Docker créera le volume pour vous dans le
/var/lib/docker/volumes
dossier. Ce volume persiste tant que vous ne tapez pasdocker-compose down -v
la source
mysql
image Docker. Vous pouvez à la place utiliser l'mariadb
image Docker, qui fonctionne parfaitement avec les volumes Docker.var/lib/docker/volumes
lieu d'avoir un répertoire dans votre dossier de projet commedata/mysql
?Il existe 3 façons:
Première voie
Vous devez spécifier le répertoire pour stocker les données mysql sur votre machine hôte . Vous pouvez ensuite supprimer le conteneur de données. Vos données mysql seront enregistrées sur votre système de fichiers local.
La définition du conteneur Mysql doit ressembler à ceci:
Deuxième voie
Serait de valider le conteneur de données avant de taper
docker-compose down
:Troisième voie
Vous pouvez également utiliser à la
docker-compose stop
place dedocker-compose down
(alors vous n'avez pas besoin de valider le conteneur)la source
volumes: - /var/lib/mysql
parce qu'il mappeHOST:CONTAINER
et si vous ne spécifiez pas avec deux-points, il mappe le même répertoire?/var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
volumes: - /var/lib/mysql
c'était équivalent àvolumes: - /var/lib/mysql:/var/lib/mysql
Vous devez créer un volume séparé pour les données mysql.
Cela ressemblera donc à ceci:
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 du tout. Le but est donc de conserver un dossier interne à partir d'un conteneur mysql.la source
volumes
sous le conteneur de données en ce que vous mettez sous votrevolumes
et que vous aviez simplementvolumes_from: - data
pourmysql
? Également tenté ceci et thew une nouvelle erreur. Dit que le répertoire existe mais n'est pas accessible en écriture et lemysql
conteneur ne fonctionnera pas.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 actuel,
my-data
vous devez le mentionner au lieu de cela./my-data
, sinon cela vous donnera cette erreur dansmysql
etmariadb
aussi.la source