Wydaje się, że nie mogę uzyskać danych MySQL, aby przetrwać, jeśli uruchomię $ docker-compose down
z następującymi.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"
Rozumiem, że w moim data
kontenerze za pomocą volumes: - /var/lib/mysql
mapuje go do katalogu mojego lokalnego komputera, w którym mysql przechowuje dane do kontenera i z powodu tego mapowania dane powinny pozostać, nawet jeśli kontenery są zniszczone. A mysql
kontener jest tylko interfejsem klienta do bazy danych i może zobaczyć katalog lokalny z powoduvolumes_from: - data
Próbowałem tej odpowiedzi i to nie zadziałało. Problem z trwałymi danymi Docker-Compose
EDYTOWAĆ
Zmieniłem .yml
jak pokazano poniżej i stworzył dir ./data
, ale teraz, kiedy biegnę docker-compose up --build
na mysql
początek pojemnik przyzwyczajenie wyrzuca błąd mówiąc
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.
źródło
Odpowiedzi:
Kontener danych jest zbędnym obejściem. Woluminy danych załatwią sprawę za Ciebie. Zmień
docker-compose.yml
na:Docker utworzy dla Ciebie wolumin w
/var/lib/docker/volumes
folderze. Ten wolumin utrzymuje się tak długo, jak długo nie piszeszdocker-compose down -v
źródło
mysql
obrazu Dockera. Zamiast tego możesz użyćmariadb
obrazu Docker, który działa bezbłędnie z woluminami Docker.var/lib/docker/volumes
zamiast katalogu w folderze projektudata/mysql
?Istnieją 3 sposoby:
Pierwszy sposób
Musisz określić katalog do przechowywania danych mysql na komputerze hosta . Następnie możesz usunąć kontener danych. Twoje dane mysql zostaną zapisane w lokalnym systemie plików.
Definicja kontenera MySQL musi wyglądać następująco:
Drugi sposób
Byłoby zatwierdzenie kontenera danych przed wpisaniem
docker-compose down
:Trzeci sposób
Możesz także użyć
docker-compose stop
zamiastdocker-compose down
(wtedy nie musisz zatwierdzać kontenera)źródło
volumes: - /var/lib/mysql
ponieważ mapujeHOST:CONTAINER
i jeśli nie określisz dwukropkiem, mapuje ten sam katalog?/var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
volumes: - /var/lib/mysql
to odpowiednikvolumes: - /var/lib/mysql:/var/lib/mysql
Musisz utworzyć osobny wolumin dla danych mysql.
Więc będzie to wyglądać tak:
I nie,
/var/lib/mysql
jest to ścieżka wewnątrz kontenera mysql i nie ma nic wspólnego ze ścieżką na komputerze hosta. Twoja maszyna hosta może nawet w ogóle nie mieć mysql. Dlatego celem jest utrwalenie wewnętrznego folderu z kontenera mysql.źródło
volumes
w kontenerze danych do tego, co można umieścić pod twoimivolumes
i po prostu miałvolumes_from: - data
zamysql
? Podjęto również próbę tego, a następnie nowy błąd. Mówi, że dir istnieje, ale nie można go zapisać, amysql
kontener nie będzie działać.Właściwie to jest ścieżka i powinieneś wspomnieć o prawidłowej ścieżce, aby to zadziałało. Jeśli twój katalog danych znajduje się w bieżącym katalogu, zamiast tego
my-data
powinieneś wspomnieć./my-data
, w przeciwnym razie da ci ten błąd wmysql
imariadb
także.źródło