127 votes

Docker-Compose données persistantes MySQL

Je n'arrive pas à obtenir de données MySQL à persister si j'exécute $ docker-compose down à la suite de .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'aide de volumes: - /var/lib/mysql cartes à mon local de machines répertoire où mysql stocke les données sur le conteneur et à cause de cette cartographie, les données doivent persister même si les conteneurs sont détruits. Et l' mysql conteneur est juste une interface client dans la base de données et peuvent voir le répertoire local en raison de l' volumes_from: - data

La tentative de cette réponse et il ne fonctionne pas. Docker-Composer Les Données Persistantes De La Difficulté À

MODIFIER

Changé ma .yml comme indiqué ci-dessous et créé un la dir ./data mais maintenant quand je le lance en docker-compose up --build le mysql conteneur ne démarre pas déclenche 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.

187voto

Ohmen Points 1921

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

44voto

Bukharov Sergey Points 3831

Il existe 3 façons:

D'abord. Vous devez spécifier le répertoire pour stocker de données mysql sur votre ordinateur hôte. Vous pouvez supprimer les données de conteneur. Votre mysql données seront sauvegardées à votre système de fichiers local.

Mysql définition du conteneur doit ressemble à ça

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"

La deuxième façon est de valider les données du conteneur avant de taper docker-compose down:

docker commit my_data_container
docker-compose down

La troisième voie. Aussi, vous pouvez utiliser docker-compose stop au lieu de docker-compose down (alors que vous n'avez pas besoin de commettre un récipient)

11voto

Dmitry Malyshenko Points 2509

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.

6voto

codelearner Points 550

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 actuel, alors, au lieu de my-data vous devez mentionner ./my-data , sinon vous obtiendrez cette erreur en mysql et mariadb aussi.

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

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