web-dev-qa-db-fra.com

Docker-Compose 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 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.
109
Adam

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

161
Ohmen

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).

37
Bukharov Sergey

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.

10
Dmitry Malyshenko

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
4
codelearner