Parece que no puedo lograr que los datos de MySQL persistan si ejecuto $ docker-compose down
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 data
contenedor, el uso lo 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 mysql
contenedor es solo una interfaz de cliente en el db y puede ver el directorio local debido avolumes_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
el mysql
contenedor no comienza a arrojar 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.
fuente
Respuestas:
El contenedor de datos es una solución superflua. Los volúmenes de datos harían el truco por usted. Altera tu
docker-compose.yml
a:Docker creará el volumen para usted en la
/var/lib/docker/volumes
carpeta. Este volumen persiste mientras no esté escribiendodocker-compose down -v
fuente
mysql
imagen Docker. En su lugar, puede usar lamariadb
imagen Docker, que funciona perfectamente con los volúmenes Docker.var/lib/docker/volumes
lugar de tener un directorio en la carpeta de tu proyectodata/mysql
?Hay 3 formas:
Primera forma
Necesita 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í:
Segunda forma
Sería confirmar el contenedor de datos antes de escribir
docker-compose down
:Tercera forma
También puede usar en
docker-compose stop
lugar dedocker-compose down
(entonces no necesita confirmar el contenedor)fuente
volumes: - /var/lib/mysql
porque se asignaHOST:CONTAINER
y si no especificas con dos puntos, se asigna el mismo directorio?/var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
volumes: - /var/lib/mysql
era equivalente avolumes: - /var/lib/mysql:/var/lib/mysql
Debe crear un volumen separado para los datos de mysql.
Entonces se verá así:
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.fuente
volumes
bajo el contenedor de datos a lo que se pone debajo de lavolumes
y simplemente teníavolumes_from: - data
paramysql
? También intenté esto y thew un nuevo error. Dice que existe el directorio pero que no se puede escribir y que elmysql
contenedor no se ejecutará.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 lo
my-data
que debería mencionar./my-data
, de lo contrario, le dará ese errormysql
ymariadb
también.fuente