Ok, jest tu kilka kwestii, którymi należy się zająć.
Zacznijmy od tego, czym jest wolumin dokowany (staraj się nie myśleć w tym momencie o swoim Macbooku lub włóczęgiej maszynie. Po prostu pamiętaj, że doki używają innego systemu plików, gdziekolwiek może się znajdować w tym momencie):Może wyobraź sobie to w ten sposób, każdy wolumin w Dockerze sam w sobie jest tylko częścią wewnętrznego systemu plików, którego używa Docker. lub montowany przez dwóch z nich w tym samym czasie, jak montowanie superszybkiej wersji jakiegoś serwera ftp na dwóch klientach lub cokolwiek innego :P ).
Zasadniczo możesz zadeklarować te woluminy (wciąż nie myśląc o swoim komputerze/sam włóczędze, tylko o oknach dokujących;) ) za pomocą instrukcji VOLUME pliku Dockerfile. Standardowy przykład, uruchom jeden kontener serwera WWW, tak jak:
FROM: nginx
VOLUME /www
Teraz wszystko, co wchodzi do /www, może teoretycznie być montowane i odłączane z kontenera, a także montowane do wielu kontenerów. Teraz sam Nginx jest nudny, więc chcemy, aby php uruchamiało pliki, które przechowuje nginx, aby stworzyć bardziej zabawną zawartość. => Musimy zamontować ten wolumin do jakiegoś kontenera php-fpm.Ergo w naszym pliku Compose zrobimy to
web:
image: nginx
php:
image: php-fpm
volumes_from:
- web
=> voila! każdy folder zadeklarowany przez dyrektywę VOLUME w kontenerze nginx/web będzie widoczny w php. Ważna uwaga, o której należy pamiętać, to, co znajduje się w /www nginx, nadpisze to, co php ma w /www.Jeśli umieścisz :ro, php nie będzie nawet mogło pisać do tego folderu :)
Teraz zbliżając się do twojego problemu, istnieje drugi sposób deklarowania woluminów, który nie wymaga ich deklarowania w pliku Dockerfile. Można to zrobić montując woluminy z hosta (w tym przypadku twój włóczęga/boo2docker). Porozmawiajmy o tym tak, jakbyśmy najpierw używali natywnego Linuksa.
Gdybyś miał umieścić coś takiego:
volumes:
- /home/myuser/folder:/folder
w twoim docker-compose.yml, oznacza to, że /home/myuser/folder zostanie teraz zamontowany w dockerze. Zastąpi wszystko, co docker ma w /folder i podobnie jak /www będzie również dostępny z elementu, który go zadeklarował. Teraz maszyna z Linuksem, na której działa demon Docker.
Tyle teorii :), w rzeczywistości prawdopodobnie potrzebujesz tylko następujących rad, aby zacząć działać :):
Sposób, w jaki boot2docker/docker-machine/kitematic i wszystkie te rzeczy radzą sobie z tym problemem, jest po prostu taki, że najpierw po prostu montują wolumin w wędrującej maszynie do kontenerów dockera, a następnie po prostu montują to w systemie plików Mac , mam nadzieję, że wszystko się ułoży :P
Teraz praktyczny problem, z którym wszyscy z tego korzystamy (lub po prostu próbujemy pomóc swoim współpracownikom w świecie słodkiego, słodkiego Dockera :P) na Macu, to uprawnienia. Mam na myśli to, że pomyśl o tym (root lub inny użytkownik obsługuje pliki w kontenerze, użytkownik włóczęgi może obsługiwać pliki na hoście włóczęgi, a następnie twój użytkownik Mac "skalfyfan" obsługuje te pliki na Macu. Wszystkie mają różne identyfikatory użytkownika i co nie => wynika z tego wiele problemów, w zależności od tego, co faktycznie działa w Docker.Mysql i Apache są szczególnie bolesne, ponieważ nie działają jako root w kontenerze.Oznacza to, że często mają problemy z zapisem do pliku Mac system.
Przed wypróbowaniem drugiego podejścia poniżej po prostu spróbuj umieścić woluminy kontenerów w katalogu domowym Maca. To rozwiąże problemy z MySQL w większości przypadków, jak odkryłem z biegiem czasu. Btw:Nie ma potrzeby deklarowania pełnych ścieżek do woluminów ./folder jest w porządku i jest odczytywany względem miejsca, w którym znajduje się twój docker-compose.yml!
Po prostu umieść compose-yml w folderze użytkowników komputerów Mac, to wszystko, co się liczy. Żaden chmod 777 -R :P ci tu nie pomoże, po prostu musi być w twoim katalogu domowym :)
Mimo to niektóre aplikacje (na przykład Apache) nadal będą sprawiać trudność. Fakt, że identyfikator użytkownika tego, co działa w kontenerze, różni się od identyfikatora użytkownika komputera Mac, sprawi, że twoje życie stanie się piekłem. Aby obejść ten problem, musisz dostosować identyfikator użytkownika oraz grupę użytkowników w sposób, który nie koliduje z uprawnieniami komputera Mac. Grupa, którą chcesz na Macu, to personel, UID, który działa, to na przykład 1000. Dlatego możesz umieścić to na końcu pliku Dockerfile:
RUN usermod -u 1000 www-data
RUN usermod -G staff www-data
lub
RUN usermod -u 1000 mysql
RUN usermod -G staff mysql
Jak się teraz dowiedziałeś:
Właśnie tak robi :)
W tym się pomyliłeś :) Jak wyjaśniono, jeśli nie podasz folderu hosta, Docker zachowa tę ścieżkę. Ale tylko dla tego kontenera i wszystko pozostanie w systemie plików dockera. W ogóle nic nie jest napisane do gospodarza! Stanie się tak zawsze tylko wtedy, gdy podasz folder hosta przed folderem kontenera!
Mam nadzieję, że to pomogło :)