Docker-Componer datos persistentes MySQL


Parece que no puedo conseguir que los datos MySQL persistan si corro $ docker-compose down con lo siguiente .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"

Entiendo que en mi contenedor data usando volumes: - /var/lib/mysql lo mapea a mi directorio local de máquinas donde mysql almacena datos en el contenedor y debido a este mapeo los datos deben persistir incluso si los contenedores se destruyen. Y el contenedor mysql es solo una interfaz de cliente en la base de datos y puede ver el directorio local debido a volumes_from: - data

Intentó esta respuesta y lo hizo no trabajo. Docker-Compose Persistent Data Trouble

EDITAR

Cambió mi .yml como se muestra a continuación y creó un dir ./data pero ahora cuando corro docker-compose up --build el contenedor mysql no comenzará a lanzar un error diciendo

  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.
Author: Community, 2016-08-27

4 answers

El contenedor de datos es una solución superflua. Los volúmenes de datos harían el truco por ti. Cambia tu 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 creará el volumen para usted en la carpeta /var/lib/docker/volumes. Este volumen persiste mientras no esté escribiendo docker-compose down -v

 104
Author: Ohmen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-08 21:37:16

Hay 3 maneras:

Primero. Necesita especificar el directorio para almacenar datos mysql en su máquina host. Puede eliminar el contenedor de datos. Sus datos mysql se guardarán en su sistema de archivos local.

La definición del contenedor Mysql debe tener este aspecto

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 segunda forma es confirmar el contenedor de datos antes de escribir docker-compose down:

docker commit my_data_container
docker-compose down

Tercera vía. También puedes usar docker-compose stop en lugar de docker-compose down (entonces no necesitas un contenedor de confirmación)

 23
Author: Bukharov Sergey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-26 22:12:17

Debe crear un volumen separado para los datos mysql.

Así que se verá así:

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

Y no, /var/lib/mysql es una ruta dentro de su contenedor mysql y no tiene nada que ver con una ruta en su máquina host. Su máquina host puede incluso no tener mysql en absoluto. Por lo tanto, el objetivo es persistir una carpeta interna de un contenedor mysql.

 7
Author: Dmitry Malyshenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-08 21:38:53

En realidad este es el camino y debe mencionar un camino válido para que esto funcione. Si su directorio de datos está en el directorio actual, entonces en lugar de my-data debe mencionar ./my-data, de lo contrario le dará ese error en mysql y mariadb también.

volumes:
 ./my-data:/var/lib/mysql
 1
Author: codelearner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-08 17:42:44