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.
68
demandé sur Community 2016-08-27 01:00:50

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

104
répondu Ohmen 2017-08-08 21:37:16

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)

23
répondu Bukharov Sergey 2016-08-26 22:12:17

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.

7
répondu Dmitry Malyshenko 2017-08-08 21:38:53

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
1
répondu codelearner 2018-04-08 17:42:44