Docker-Compose des données persistantes MySQL
Je n'arrive pas à obtenir les données MySQL pour persister si j'exécute $ docker-compose down
avec le suivant .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 en utilisant volumes: - /var/lib/mysql
l'associe à mon répertoire machines locales où mysql stocke des données au conteneur et en raison de cette cartographie les données devraient persister même si les conteneurs sont détruits. Et le conteneur mysql
est juste une interface client dans le db et peut voir le local répertoire à cause de volumes_from: - data
a tenté cette réponse et elle n'a pas fonctionné. Docker-Composer Persistent Data Trouble
MODIFIER
a changé mon .yml
comme montré ci-dessous et a créé un dir ./data
mais maintenant quand je cours docker-compose up --build
le mysql
conteneur ne démarre erreur 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.
4 réponses
le conteneur de données est une solution superflue. "151950920 les Données" volumes ferait l'affaire pour vous. Modifier 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 va créer le volume pour vous dans le dossier /var/lib/docker/volumes
. Ce volume persiste aussi longtemps que vous ne tapez pas docker-compose down -v
il y a 3 façons:
premier. vous devez spécifier l'annuaire pour stocker des données mysql sur votre machine hôte . Vous pouvez supprimer le conteneur de données. Vos données mysql seront sauvegardées sur votre système de fichiers local.
Mysql la 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"
Deuxième manière est de valider les données du conteneur 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
(alors vous n'avez pas besoin de conteneur commit)
vous devez créer un volume séparé pour les données mysql.
donc il ressemblera à ceci:
volumes_from:
- data
volumes:
- ./mysql-data:/var/lib/mysql
et non, /var/lib/mysql
est un chemin à l'intérieur de votre conteneur mysql et n'a rien à voir avec un chemin sur votre machine hôte. Votre machine hôte peut-être même pas mysql. Donc le but est de persister 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 est dans le répertoire courant, alors au lieu de my-data
vous devez mentionner ./my-data
, sinon il vous donnera cette erreur dans mysql
et mariadb
aussi.
volumes:
./my-data:/var/lib/mysql