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.
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
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)
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.
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
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