220 votes

Docker-Compose des données persistantes MySQL

Je n'arrive pas à faire en sorte que les données MySQL persistent si j'exécute $ docker-compose down avec les éléments suivants .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"

Je comprends que dans mon data en utilisant volumes: - /var/lib/mysql le fait correspondre au répertoire de mes machines locales où mysql stocke les données dans le conteneur. Grâce à ce mappage, les données devraient persister même si les conteneurs sont détruits. Et le mysql n'est qu'une interface client dans la base de données et peut voir le répertoire local grâce à l'interface de l'utilisateur. volumes_from: - data

J'ai tenté cette réponse et elle n'a pas fonctionné. Trouble des données persistantes de Docker-Compose

EDITAR

J'ai changé mon .yml comme indiqué ci-dessous et créé un répertoire ./data mais maintenant quand je lance docker-compose up --build el mysql Le conteneur ne démarre pas et l'erreur suivante apparaît

  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.

0 votes

323voto

Ohmen Points 1921

Le conteneur de données est une solution de rechange superflue. Volumes de données ferait l'affaire pour vous. Modifiez votre docker-compose.yml a:

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 fichier /var/lib/docker/volumes dossier. Ce volume persiste tant que vous ne tapez pas docker-compose down -v

24 votes

À partir de MySQL 5.7.6, il y aura (de nouveau) problèmes de permission avec le mysql Image Docker. Vous pouvez à la place utiliser le mariadb Image Docker, qui fonctionne parfaitement avec des volumes Docker.

0 votes

Cette solution a fonctionné pour moi. Quelques notes secondaires/précisions : 1. lorsque vous utilisez la configuration ci-dessus dans docker-compose.yml et que vous déployez votre pile de services à l'aide de "docker stack deploy -c docker-compose.yml mystack", il n'est pas nécessaire de créer le volume manuellement, il sera créé automatiquement pour vous sous le nom /var/lib/docker/volumes/mystack_my-datavolume (remarquez qu'il ajoute "mystack_" au nom du volume). 2. Je n'ai pas eu à changer les permissions sur mon répertoire. Même si j'ai des fichiers appartenant à mysql:Root dans mon conteneur, ils ont été créés en tant que 27:Root sur mon hôte Docker sans problème.

18 votes

Pourquoi voulez-vous le stocker dans var/lib/docker/volumes au lieu d'avoir un répertoire dans le dossier de votre projet comme data/mysql ?

73voto

Bukharov Sergey Points 3831

Il y a 3 façons de procéder :

Premier moyen

Vous devez spécifier le répertoire pour stocker les données mysql sur votre ordinateur. machine hôte . Vous pouvez ensuite retirer 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 voie

Il serait préférable 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 (alors vous n'avez pas besoin de commiter le conteneur)

0 votes

Je ne peux pas juste avoir volumes: - /var/lib/mysql parce qu'il s'agit d'une carte HOST:CONTAINER et si vous ne spécifiez pas avec un deux-points, le répertoire est le même ?

0 votes

Non. Malheureusement, dans ce cas, docker fait correspondre le répertoire du conteneur à un dossier hôte aléatoire, comme par exemple /var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881‌​e5a62996d7084e07793f‌​86280535

0 votes

Ok, je pensais volumes: - /var/lib/mysql était équivalent à volumes: - /var/lib/mysql:/var/lib/mysql

19voto

Hassan Saeed Points 1213

Tout d'abord, vous devez supprimer toutes les anciennes données mysql en utilisant

docker-compose down -v

après cela, ajoutez deux lignes dans votre docker-compose.yml

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

y

volumes:
  mysql-data:

votre docker-compose.yml final ressemblera à ceci

version: '3.1'

services:
  php:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 80:80
    volumes:
      - ./src:/var/www/html/
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - mysql-data:/var/lib/mysql

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
volumes:
  mysql-data:

après cela, utilisez cette commande

docker-compose up -d

maintenant vos données seront persistantes et ne seront pas effacées même après avoir utilisé cette commande

docker-compose down

extra:- mais si vous voulez supprimer toutes les données alors vous utiliserez

docker-compose down -v

15voto

Dmitry Malyshenko Points 2509

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

Cela ressemblera donc à 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 même ne pas avoir de mysql du tout. L'objectif est donc de faire persister un dossier interne à partir d'un conteneur mysql.

0 votes

Ce ne serait pas différent que de changer mon volumes sous le conteneur de données à ce que vous mettez sous votre volumes et a simplement volumes_from: - data para mysql ? J'ai également tenté de le faire et j'ai obtenu une nouvelle erreur. Il est dit que le répertoire existe mais qu'il n'est pas accessible en écriture et mysql le conteneur ne fonctionnera pas.

0 votes

Bien sûr, vous devez créer un dossier local avec un chemin ./mysql-data (ou ce que vous mettriez avant le point-virgule).

0 votes

Voir mon édition. Je ne l'ai pas fait avant que tu ne commentes. Mais j'ai créé un répertoire local. On dirait qu'il y a un problème de permission maintenant.

13voto

codelearner Points 550

En fait, il s'agit du chemin et vous devez 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 y mariadb également.

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

2 votes

Les deux méthodes sont valables si elles sont utilisées correctement. La première, sans les notations de chemin, est en fait un volume nommé, qui doit être initialisé avant de pouvoir être utilisé. Dans le fichier docker-compose, nous pouvons avoir une section volumes de haut niveau pour configurer la correspondance d'un nom à un endroit spécifique sur l'hôte. Après cela, le volume peut être référencé uniquement par son nom.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X