Basierend auf der @dekin-Forschung habe ich Folgendes getan, um das Problem zu lösen:
Dockerfile:
FROM mysql:latest
RUN cp -r /var/lib/mysql /var/lib/mysql-no-volume
CMD ["--datadir", "/var/lib/mysql-no-volume"]
Erstellen und ausführen:
docker build . -t my-mysql
docker run -e MYSQL_ROOT_PASSWORD=root -it my-mysql
Basierend auf der Antwort von @Robert habe ich diesen Dockerfile
erhalten :
FROM mysql:5.6.22
RUN cp -r /var/lib/mysql /var/lib/mysql-no-volume
RUN sed -i -e "s|/var/lib/mysql|/var/lib/mysql-no-volume|" /etc/mysql/my.cnf
Die CMD
Override hat bei mir nicht funktioniert, Container wurde mit einem seltsamen Fehler angehalten:
2019-02-21 15:18:50 1 [Note] Plugin 'FEDERATED' is disabled.
mysqld: Table 'mysql.plugin' doesn't exist
2019-02-21 15:18:50 1 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
Ich vermute, dass die ursprüngliche CMD
Befehl hat mehr Dinge getan, die jetzt fehlen (in @Robert answer), also habe ich es auf eine andere Art und Weise gemacht. Ich habe es nicht mit latest
versucht Version, aber ich denke, es sollte funktionieren.
Wenn Sie docker-compose
verwenden , muss kein benutzerdefiniertes Image erstellt werden. Fügen Sie einfach das Flag --datadir=/var/lib/mysql-no-volume
hinzu zu Ihrem Befehl beim Ziehen der mysql
Bild.
Beispiel:
version: '2.4'
services:
mysql:
image: mysql:5.7
command: "mysqld --character-set-server=utf8 --collation-server=utf8_general_ci --datadir=/var/lib/mysql-no-volume"
Das offizielle MySQL-Image speichert Daten in einem Volume. Normalerweise ist dies gewünscht, damit Ihre Daten über die Lebensdauer Ihres Containers hinaus bestehen bleiben können, aber Datenvolumen umgehen das Union File System und werden nicht an das Image gebunden.
Sie können erreichen, was Sie versuchen, indem Sie Ihr eigenes MySQL-Basisimage ohne Volumes erstellen. Sie können dann Daten hinzufügen und in ein Image übertragen, aber alle Daten, die einem laufenden Container nach der Übertragung hinzugefügt werden, gehen verloren, wenn der Container verschwindet.