Docker-Composer persistant de données MySQL
Je n'arrive pas à obtenir de données MySQL à persister si je lance $ docker-compose down
avec le suivant .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"
Ma compréhension est que dans mon data
conteneur à l'aide de volumes: - /var/lib/mysql
cartes à mon local de machines répertoire où mysql stocke les données sur le conteneur et à cause de cette cartographie, les données doivent persister même si les conteneurs sont détruits. Et le mysql
conteneur est juste une interface client dans la base de données et peuvent voir le répertoire local en raison de volumes_from: - data
Tenté cette réponse et il ne fonctionne pas. Docker-Composer Les Données Persistantes De La Difficulté À
MODIFIER
Changé ma .yml
comme indiqué ci-dessous et créé un la dir ./data
mais maintenant quand je lance docker-compose up --build
la mysql
conteneur ne démarre pas déclenche une erreur en disant
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.
Vous devez vous connecter pour publier un commentaire.
Le conteneur de données est un superflu solution de contournement. Les données des volumes de ferait l'affaire pour vous. Modifier votre
docker-compose.yml
à:Docker va créer le volume pour vous dans la
/var/lib/docker/volumes
dossier. Ce volume persistent aussi longtemps que vous ne tapez pasdocker-compose down -v
mysql
Docker image. Vous pouvez utiliser à la place lamariadb
Docker image, , qui fonctionne parfaitement avec Docker volumes.var/lib/docker/volumes
au lieu d'avoir répertoire dans votre dossier de projet commedata/mysql
?docker-compose down
et de perdre mon volume. Comme il s'avère, que vous avez à fairedocker-compose down -v
afin de perdre définitivement votre volume, qui m'a fait me sentir beaucoup mieux sur toute cette approche. Je pense qu'une meilleure question, peut-être, pourquoi créer un répertoire de vous-même lors de docker peut prendre soin de cela pour vous entièrement?Il y a 3 façons:
Première
Vous avez besoin de spécifier le répertoire de stockage de données mysql sur votre machine hôte. Vous pouvez alors retirer le conteneur de données. Votre mysql données seront sauvegardées à votre système de fichiers local.
Mysql définition du conteneur doit ressembler à ceci:
Deuxième façon
Serait de commettre le conteneur de données avant de taper
docker-compose down
:Troisième voie
Vous pouvez également utiliser
docker-compose stop
au lieu dedocker-compose down
(alors que vous n'avez pas besoin de commettre le conteneur)volumes: - /var/lib/mysql
parce que c'cartesHOST:CONTAINER
et si vous ne spécifiez pas de w/ un colon, c'cartes de la même dir?/var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
volumes: - /var/lib/mysql
était équivalent àvolumes: - /var/lib/mysql:/var/lib/mysql
Vous devez créer un volume distinct de données mysql.
De sorte qu'il ressemble à ceci:
Et non,
/var/lib/mysql
est un chemin à l'intérieur de votre mysql conteneur et n'a rien à voir avec un chemin d'accès sur votre ordinateur hôte. Votre machine hôte peut-être même pas mysql. Donc le but est de conserver un dossier interne à partir d'une base de données mysql contenant.volumes
sous le conteneur de données sur ce que vous mettez sous votrevolumes
et avait tout simplementvolumes_from: - data
pourmysql
? Aussi tenté ce et ce une nouvelle erreur. Dit dir existe, mais pas accessible en écriture et enmysql
conteneur ne sera pas exécuté.En fait c'est le chemin d'accès et vous devriez le mentionner un chemin d'accès valide pour que cela fonctionne. Si votre répertoire de données est dans le répertoire courant, puis, au lieu de
my-data
vous devriez le mentionner./my-data
, sinon, il vous donnera l'erreur dansmysql
etmariadb
aussi.