Parece que no puedo lograr que los datos de MySQL persistan si ejecuto $ docker-compose downlo 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 datacontenedor, el uso lo volumes: - /var/lib/mysqlasigna 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 mysqlcontenedor 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 .ymlcomo se muestra a continuación y creé un directorio, ./datapero ahora cuando ejecuto docker-compose up --buildel mysqlcontenedor 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.ymla:Docker creará el volumen para usted en la
/var/lib/docker/volumescarpeta. Este volumen persiste mientras no esté escribiendodocker-compose down -vfuente
mysqlimagen Docker. En su lugar, puede usar lamariadbimagen Docker, que funciona perfectamente con los volúmenes Docker.var/lib/docker/volumeslugar 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 stoplugar dedocker-compose down(entonces no necesita confirmar el contenedor)fuente
volumes: - /var/lib/mysqlporque se asignaHOST:CONTAINERy si no especificas con dos puntos, se asigna el mismo directorio?/var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535volumes: - /var/lib/mysqlera equivalente avolumes: - /var/lib/mysql:/var/lib/mysqlDebe crear un volumen separado para los datos de mysql.
Entonces se verá así:
Y no,
/var/lib/mysqles 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
volumesbajo el contenedor de datos a lo que se pone debajo de lavolumesy simplemente teníavolumes_from: - dataparamysql? También intenté esto y thew un nuevo error. Dice que existe el directorio pero que no se puede escribir y que elmysqlcontenedor 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-dataque debería mencionar./my-data, de lo contrario, le dará ese errormysqlymariadbtambién.fuente