Docker-Compose dati persistenti MySQL


156

Non riesco a far persistere i dati di MySQL se corro $ docker-compose downcon quanto segue.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"

La mia comprensione è che nel mio datacontenitore l'utilizzo lo volumes: - /var/lib/mysqlmappa nella mia directory di macchine locali dove mysql memorizza i dati nel contenitore e, a causa di questa mappatura, i dati dovrebbero persistere anche se i contenitori vengono distrutti. E il mysqlcontenitore è solo un'interfaccia client nel database e può vedere la directory locale a causa divolumes_from: - data

Ho tentato questa risposta e non ha funzionato. Problema dati persistenti Docker-Compose

MODIFICARE

Modificato .ymlcome mostrato di seguito e creato un dir ./datama ora quando eseguo docker-compose up --buildil mysqlcontenitore non si avvia genera un errore dicendo

  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.

Risposte:


223

Il contenitore di dati è una soluzione superflua. I volumi di dati farebbero al caso tuo. Modifica il tuo docker-compose.ymla:

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 creerà il volume per te nella /var/lib/docker/volumescartella. Questo volume persiste finché non si digitadocker-compose down -v


18
A partire da MySQL 5.7.6 ci saranno (di nuovo) problemi di autorizzazione con l' mysqlimmagine Docker. Puoi invece usare l' mariadbimmagine Docker, che funziona perfettamente con i volumi Docker.
Peterino,

Questa soluzione ha funzionato per me. Un paio di note a margine / precisazioni: 1. quando si utilizza la configurazione sopra in docker-compose.yml e si distribuisce il proprio stack di servizi utilizzando "stack docker deploy -c docker-compose.yml mystack", non è necessario creare il volume manualmente, verrà creato come / var / lib / docker / volume / mystack_my-datavolume automaticamente per te (nota che antepone "mystack_" al nome del volume). 2. Non ho dovuto modificare le autorizzazioni sulla mia directory. Anche se ho file di proprietà di mysql: root nel mio contenitore, sono stati creati come 27: root sul mio host Docker senza problemi.
Joey Cote,

10
Perché mai vuoi archiviarlo var/lib/docker/volumesinvece di avere una directory nella cartella del tuo progetto simile data/mysql?
Il padrino

@TheGodfather La mia ipotesi sarebbe se non si desidera distribuire dati MySQL sulla propria macchina di produzione; altrimenti, è un'idea molto valida tenere tutto insieme.
Duncan,

1
@louhow Penso perché mi sento più sicuro quando tutte le parti della mia app e dei dati sono archiviati in qualche modo insieme, e non ho dipendenze su un volume da qualche parte
Il padrino

53

Ci sono 3 modi:

Primo modo

È necessario specificare la directory per archiviare i dati mysql sul computer host . È quindi possibile rimuovere il contenitore di dati. I tuoi dati mysql verranno salvati sul tuo filesystem locale.

La definizione del contenitore Mysql deve essere simile a questa:

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"

Secondo modo

Sarebbe impegnare il contenitore di dati prima di digitare docker-compose down:

docker commit my_data_container
docker-compose down

Terza via

Inoltre puoi usare docker-compose stopinvece di docker-compose down(quindi non è necessario eseguire il commit del contenitore)


Non posso semplicemente averlo volumes: - /var/lib/mysqlperché è mappato HOST:CONTAINERe se non specifichi w / a due punti mappa lo stesso dir?
Adam,

Non. sfortunatamente in questo caso la finestra mobile esegue il mapping di questa directory del contenitore su una cartella host casuale come/var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
Bukharov Sergey,

Ok, pensavo volumes: - /var/lib/mysqlfosse equivalente avolumes: - /var/lib/mysql:/var/lib/mysql
Adam,

il tuo terzo modo non funzionerà perché la finestra mobile non impegna i dati dai volumi all'immagine. vedi github.com/moby/moby/issues/6999
Ohmen,

13

Devi creare un volume separato per i dati mysql.

Quindi sarà simile a questo:

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

E no, /var/lib/mysqlè un percorso all'interno del tuo contenitore mysql e non ha nulla a che fare con un percorso sul tuo computer host. La tua macchina host potrebbe anche non avere affatto mysql. Quindi l'obiettivo è quello di mantenere una cartella interna da un contenitore mysql.


Non sarebbe niente di diverso da cambiare la mia volumessotto il contenitore di dati per ciò che si mette sotto la vostra volumese semplicemente avuto volumes_from: - dataper mysql? Ho anche tentato questo e hanno mostrato un nuovo errore. Dice dir esiste ma non è scrivibile e il mysqlcontenitore non funzionerà.
Adam,

Ovviamente devi creare una cartella locale con un percorso ./mysql-data (o qualunque cosa tu voglia mettere prima del punto e virgola)
Dmitry Malyshenko il

Vedi la mia modifica. Non ce l'ho fatta prima di commentare. Ma ha creato dir locale. Sembra che ci sia un problema di autorizzazione ora.
Adam,

ERRORE: il servizio "mysql" monta i volumi da "dati", che non è il nome di un servizio o contenitore.
Massimiliano Arione,

10

In realtà questo è il percorso e dovresti menzionare un percorso valido affinché questo funzioni. Se la tua directory di dati è nella directory corrente, invece di my-datate dovresti menzionarla ./my-data, altrimenti ti darà quell'errore mysqle mariadbanche.

volumes:
 ./my-data:/var/lib/mysql
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.