Ich kann nicht scheinen, dass MySQL-Daten bestehen bleiben, wenn ich $ docker-compose down
Folgendes ausführe.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"
Ich verstehe, dass in meinem data
Container mithilfe volumes: - /var/lib/mysql
von Zuordnungen die Zuordnung zu meinem lokalen Maschinenverzeichnis erfolgt, in dem MySQL Daten im Container speichert. Aufgrund dieser Zuordnung sollten die Daten auch dann bestehen bleiben, wenn die Container zerstört werden. Und der mysql
Container ist nur eine Client-Schnittstelle in die Datenbank und kann das lokale Verzeichnis wegen sehenvolumes_from: - data
Ich habe diese Antwort versucht und es hat nicht funktioniert. Docker-Compose Persistent Data Trouble
BEARBEITEN
Ich habe mein .yml
wie unten gezeigt geändert und ein Verzeichnis erstellt, ./data
aber jetzt, wenn ich docker-compose up --build
den mysql
Container starte, wird kein Fehler ausgelöst
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.
quelle
Antworten:
Der Datencontainer ist eine überflüssige Problemumgehung. Datenmengen würden den Trick für Sie tun. Ändern Sie Ihre
docker-compose.yml
zu:Docker erstellt das Volume für Sie im
/var/lib/docker/volumes
Ordner. Diese Lautstärke bleibt bestehen, solange Sie nicht tippendocker-compose down -v
quelle
mysql
Docker-Image auf. Sie können stattdessen dasmariadb
Docker-Image verwenden, das mit Docker-Volumes einwandfrei funktioniert .var/lib/docker/volumes
anstatt ein Verzeichnis in Ihrem Projektordner zu habendata/mysql
?Es gibt drei Möglichkeiten:
Erster Weg
Sie müssen das Verzeichnis angeben, in dem MySQL-Daten auf Ihrem Host-Computer gespeichert werden sollen . Sie können dann den Datencontainer entfernen. Ihre MySQL-Daten werden in Ihrem lokalen Dateisystem gespeichert.
Die Definition des MySQL-Containers muss folgendermaßen aussehen:
Zweiter Weg
Wäre, den Datencontainer vor der Eingabe festzuschreiben
docker-compose down
:Dritter Weg
Sie können auch
docker-compose stop
anstelle von verwendendocker-compose down
(dann müssen Sie den Container nicht festschreiben)quelle
volumes: - /var/lib/mysql
weil es zugeordnet istHOST:CONTAINER
und wenn Sie keinen Doppelpunkt angeben, wird dasselbe Verzeichnis zugeordnet?/var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
volumes: - /var/lib/mysql
es wäre gleichbedeutend mitvolumes: - /var/lib/mysql:/var/lib/mysql
Sie müssen ein separates Volume für MySQL-Daten erstellen.
So wird es aussehen:
Und nein,
/var/lib/mysql
ist ein Pfad in Ihrem MySQL-Container und hat nichts mit einem Pfad auf Ihrem Host-Computer zu tun. Ihr Host-Computer verfügt möglicherweise überhaupt nicht über MySQL. Das Ziel ist es also, einen internen Ordner aus einem MySQL-Container beizubehalten.quelle
volumes
unter den Datencontainer zu dem, was Sie unter Ihrem setzenvolumes
und einfach hattevolumes_from: - data
fürmysql
? Auch versucht dies und thew einen neuen Fehler. Sagt, dass dir existiert, aber nicht beschreibbar ist und dermysql
Container nicht ausgeführt wird.Eigentlich ist dies der Pfad und Sie sollten einen gültigen Pfad angeben, damit dies funktioniert. Wenn sich Ihr Datenverzeichnis im aktuellen Verzeichnis befindet
my-data
, sollten Sie es stattdessen erwähnen./my-data
, andernfalls wird Ihnen dieser Fehler inmysql
undmariadb
auch angezeigt .quelle