example compose docker docker-compose

example - docker-compose mysql volume



Docker-Componer datos persistentes MySQL (4)

Debe crear un volumen separado para los datos de mysql.

Entonces 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. Entonces, el objetivo es conservar una carpeta interna de un contenedor mysql.

Parece que no puedo lograr que los datos de MySQL persistan si ejecuto $ docker-compose down con el 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"

Tengo entendido que en mi contenedor de data usando volumes: - /var/lib/mysql asigna al directorio de mi máquina local donde mysql almacena datos en el contenedor y debido a esta asignación, los datos deberían persistir incluso si los contenedores se destruyen. Y el contenedor mysql es solo una interfaz de cliente en el db y puede ver el directorio local debido a volumes_from: - data

Intenté esta respuesta y no funcionó. Problema de datos persistentes de Docker-Compose

EDITAR

Cambié mi .yml como se muestra a continuación y creé un directorio ./data pero ahora cuando ejecuto docker-compose up --build the mysql container no comenzará docker-compose up --build el 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.


El contenedor de datos es una solución superflua. Data-volumes harían el truco por usted. docker-compose.yml su docker-compose.yml para:

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 por usted en la carpeta /var/lib/docker/volumes volume. Este volumen persiste mientras no esté escribiendo docker-compose down -v


En realidad, esta es la ruta y debe mencionar una ruta válida para que esto funcione. Si su directorio de datos está en el directorio actual, en lugar de my-data , debe mencionar ./my-data , de lo contrario, también le dará ese error en mysql y mariadb .

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


Hay 3 formas:

Primera forma

Debe especificar el directorio para almacenar datos mysql en su máquina host . Luego 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 verse así:

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"

Segunda forma

Sería confirmar el contenedor de datos antes de escribir docker-compose down :

docker commit my_data_container docker-compose down

Tercera forma

También puede usar docker-compose stop lugar de docker-compose down (entonces no necesita confirmar el contenedor)