Próbuję użyć docker-machine z docker-compose. Plik docker-compose.yml ma następujące definicje:
web:
build: .
command: ./run_web.sh
volumes:
- .:/app
ports:
- "8000:8000"
links:
- db:db
- rabbitmq:rabbit
- redis:redis
Podczas uruchamiania docker-compose up -d
wszystko idzie dobrze, dopóki nie spróbujesz wykonać polecenia i nie zostanie wyświetlony błąd:
Nie można uruchomić kontenera b58e2dfa503b696417c1c3f49e2714086d4e9999bd71915a53502cb6ef43936d: [8] Błąd systemu: exec: "./run_web.sh": stat ./run_web.sh: brak takiego pliku lub katalogu
Woluminy lokalne nie są montowane na komputerze zdalnym. Jaka jest zalecana strategia montowania lokalnych woluminów z kodem aplikacji internetowych?
docker
dockerfile
docker-compose
jdcaballerov
źródło
źródło
Odpowiedzi:
Docker-machine automatycznie montuje katalog użytkowników ... Ale czasami to po prostu nie wystarcza.
Nie wiem o Dockerze 1.6, ale w 1.8 MOŻESZ dodać dodatkowy montaż do docker-machine
Dodaj punkt instalacji maszyny wirtualnej (część 1)
CLI : (działa tylko wtedy, gdy maszyna jest zatrzymana)
VBoxManage sharedfolder add <machine name/id> --name <mount_name> --hostpath <host_dir> --automount
Tak więc przykład w oknach byłby
GUI : (NIE wymaga zatrzymania maszyny)
<machine name>
(domyślnie)<host dir>
(e :)<mount name>
(e)Montowanie w boot2docker (część 2)
Ręcznie zamontuj w boot2docker :
docker-machine ip default
itp.sudo mkdir -p <local_dir>
sudo mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>
Ale to jest dobre tylko do momentu ponownego uruchomienia komputera, a wtedy montaż zostanie utracony ...
Dodanie automount do boot2docker :
Po zalogowaniu się do maszyny
/mnt/sda1/var/lib/boot2docker/bootlocal.sh
, sda1 może być inny dla Ciebie ...Dodaj
Po tych zmianach powinieneś mieć nowy punkt montowania. Jest to jeden z niewielu plików, które udało mi się znaleźć, wywoływany podczas rozruchu i który jest trwały. Dopóki nie znajdzie się lepszego rozwiązania, powinno to działać.
Stara metoda: mniej zalecana , ale pozostawiona jako alternatywa
/mnt/sda1/var/lib/boot2docker/profile
, sda1 może być inny dla Ciebie ...Dodaj
W ostateczności możesz wybrać nieco bardziej żmudną alternatywę i możesz po prostu zmodyfikować obraz rozruchowy.
git -c core.autocrlf=false clone https://github.com/boot2docker/boot2docker.git
cd boot2docker
git -c core.autocrlf=false checkout v1.8.1
# lub odpowiednią wersjęrootfs/etc/rc.d/automount-shares
Dodaj
try_mount_share <local_dir> <mount_name>
linię tuż przed fi na końcu. Na przykładTylko pamiętaj, aby nie ustawiać niczego, czego potrzebuje system operacyjny, takich jak / bin itp.
docker build -t boot2docker .
# Za pierwszym razem zajmie to około godziny :(docker run --rm boot2docker > boot2docker.iso
To działa, jest po prostu długie i skomplikowane
docker w wersji 1.8.1, docker-machine w wersji 0.4.0
źródło
/mnt/sda1/var/lib/boot2docker/profile
, czy możesz wyjaśnić, dlaczego przeszedłeś na używanie/mnt/sda1/var/lib/boot2docker/bootlocal.sh
? Również przekreślenie tak dużej ilości tekstu nie przyczynia się do czytelności twojej odpowiedzi ;-)bootlocal.sh
metodę. Wszystko, co mogę powiedzieć, to czystszy wygląd, gdy wystarczy użyć polecenia montowania, tak jak to zrobiłem,bootlocal.sh
niż w profilu. Ponadto zazwyczaj uważam, żeprofile
można go uruchomić wiele razy, a montaż wystarczy uruchomić tylko raz, więc ma to większy sens. Ale oba mogą działać.Wystąpił również ten problem i wygląda na to, że woluminy lokalne nie są montowane podczas korzystania z platformy docker-machine. Rozwiązaniem hakerskim jest
pobierz bieżący katalog roboczy instancji docker-machine
docker-machine ssh <name> pwd
użyj narzędzia wiersza poleceń, takiego jak
rsync
skopiowanie folderu do systemu zdalnegoDomyślnym pwd jest / root, więc powyższe polecenie byłoby
rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:/root
Uwaga: musisz podać hasło do systemu zdalnego. Możesz szybko utworzyć jedno przez ssh do zdalnego systemu i tworząc hasło.
zmień punkt podłączenia woluminu w
docker-compose.yml
pliku z.:/app
na/root/<name_of_folder>:/app
biegać
docker-compose up -d
Uwaga: jeśli zmiany są dokonywane lokalnie, nie zapomnij uruchomić ponownie,
rsync
aby przesłać zmiany do systemu zdalnego.Nie jest doskonały, ale działa. Trwa problem https://github.com/docker/machine/issues/179
Inne projekty, które próbują rozwiązać ten problem, obejmują docker-rsync
źródło
exit status 255
i muszę całkowicie odtworzyć maszynę.docker 1.10
idocker-machine 0.6.0
gist.github.com/cristobal/fcb0987871d7e1f7449eW tej chwili naprawdę nie widzę żadnego sposobu na zamontowanie woluminów na maszynach, więc teraz podejście polegałoby na skopiowaniu lub zsynchronizowaniu potrzebnych plików na komputerze.
Istnieją rozmowy na temat rozwiązania tego problemu w repozytorium github platformy docker-machine. Ktoś wysłał żądanie ściągnięcia implementujące scp na docker-machine i zostało już scalone na master, więc jest bardzo prawdopodobne, że w następnej wersji będzie to zawierać.
Ponieważ nie jest jeszcze wydany, do tej pory zalecałbym, aby jeśli masz swój kod hostowany na github, po prostu sklonuj repozytorium przed uruchomieniem aplikacji
Aktualizacja: Patrząc dalej, odkryłem, że funkcja jest już dostępna w najnowszych plikach binarnych , kiedy je zdobędziesz, będziesz mógł skopiować swój lokalny projekt, wykonując takie polecenie:
Będąc tym ogólną formą:
Możesz więc kopiować pliki z, do i między komputerami.
Pozdrawiam! 1
źródło
Od października 2017 pojawiło się nowe polecenie dla docker-machine, które załatwia sprawę, ale przed wykonaniem upewnij się, że nie ma nic w katalogu, w przeciwnym razie może się zgubić:
docker-machine mount <machine-name>:<guest-path> <host-path>
Sprawdź dokumentację, aby uzyskać więcej informacji: https://docs.docker.com/machine/reference/mount/
PR ze zmianą: https://github.com/docker/machine/pull/4018
źródło
...:<guest-path> <host-path>
(a nie na odwrót). Coś tak prostego i krytycznego, jak to odnotować w dokumentacji ... po prostu nie jest!Jeśli wybierzesz opcję rsync z docker-machine, możesz połączyć ją z takim
docker-machine ssh <machinename>
poleceniem:rsync -rvz --rsh='docker-machine ssh <machinename>' --progress <local_directory_to_sync_to> :<host_directory_to_sync_to>
Używa tego formatu polecenia rsync, pozostawiając
HOST
puste:rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
( http://linuxcommand.org/man_pages/rsync1.html )
źródło
W końcu dowiedziałem się, jak uaktualnić Windows Docker Toolbox do wersji 1.12.5 i utrzymać moje woluminy w pracy, dodając folder współdzielony w
Oracle VM VirtualBox
menedżerze i wyłączając konwersję ścieżki. Jeśli masz system Windows 10+, najlepiej jest używać nowszego Dockera dla systemu Windows.Pierwsza aktualizacja Ból:
Przykład bazy danych Redis:
redis: image: redis:alpine container_name: redis ports: - "6379" volumes: - "/var/db/redis:/data:rw"
W terminalu Docker Quickstart ....
docker-machine stop default
- upewnij się, że maszyna wirtualna została włamanaW Oracle VM VirtualBox Manager ...
default
maszynie wirtualnej za pośrednictwem lub wiersza poleceńD:\Projects\MyProject\db
=>/var/db
W
docker-compose.yml
..."/var/db/redis:/data:rw"
W terminalu Docker Quickstart ....
COMPOSE_CONVERT_WINDOWS_PATHS=0
(dla wersji Toolbox> = 1.9.0)docker-machine start default
aby ponownie uruchomić maszynę wirtualną.cd D:\Projects\MyProject\
docker-compose up
powinno teraz działać.Teraz tworzy bazę danych redis w
D:\Projects\MyProject\db\redis\dump.rdb
Po co unikać względnych ścieżek hostów?
I unikać ścieżek względnych hosta dla systemu Windows Toolbox, ponieważ mogą one wprowadzać nieprawidłowe znaki „\”. Nie jest to tak przyjemne, jak używanie ścieżek względnych,
docker-compose.yml
ale przynajmniej moi koledzy programiści mogą z łatwością to zrobić, nawet jeśli ich folder projektu znajduje się w innym miejscu bez konieczności hakowaniadocker-compose.yml
pliku (złe dla SCM).Pierwotna przyczyna
FYI ... Oto oryginalny błąd, który otrzymałem, gdy użyłem ładnych, czystych ścieżek względnych, które działały dobrze dla starszych wersji. Moje mapowanie wolumenu było kiedyś sprawiedliwe
"./db/redis:/data:rw"
ERROR: for redis Cannot create container for service redis: Invalid bind mount spec "D:\\Projects\\MyProject\\db\\redis:/data:rw": Invalid volume specification: 'D:\Projects\MyProject\db\redis:/data
Dzieje się tak z dwóch powodów.
D:
dysku\
znakówdocker-compose
dodaje je i obwinia za to !!COMPOSE_CONVERT_WINDOWS_PATHS=0
aby zatrzymać ten nonsens.Zalecam udokumentowanie dodatkowego mapowania folderów współdzielonych maszyny wirtualnej w
docker-compose.yml
pliku, ponieważ może być konieczne ponowne odinstalowanie VirtualBox i zresetowanie folderu współdzielonego, a mimo to inni programiści będą Cię za to kochać.źródło
Wszystkie inne odpowiedzi były dobre na ten czas, ale teraz (Docker Toolbox v18.09.3) wszystko działa po wyjęciu z pudełka. Wystarczy dodać udostępniony folder do maszyny wirtualnej VirtualBox.
Docker Toolbox automatycznie dodaje
C:\Users
jako folder współdzielony/c/Users
pod wirtualną maszyną linux (używając funkcji folderów współdzielonych Virtual Box), więc jeśli twójdocker-compose.yml
plik znajduje się gdzieś pod tą ścieżką i montujesz katalogi maszyny hosta tylko pod tą ścieżką - wszystko powinno działać po wyjęciu z pudełka.Na przykład:
C:\Users\username\my-project\docker-compose.yml
:.
Ścieżka automatycznie przekształca się w absolutnym ścieżkiC:\Users\username\my-project
, a następnie/c/Users/username/my-project
. I tak właśnie wygląda ta ścieżka z punktu widzenia maszyny wirtualnej linux (możesz to sprawdzić:docker-machine ssh
a potemls /c/Users/username/my-project
). Tak więc ostateczny wierzchowiec będzie/c/Users/username/my-project:/app
.Wszystko działa dla Ciebie w sposób przejrzysty.
Ale to nie działa, jeśli ścieżka montowania hosta nie znajduje się pod
C:\Users
ścieżką. Na przykład, jeśli umieścisz to samodocker-compose.yml
podD:\dev\my-project
.Można to jednak łatwo naprawić.
docker-machine stop
).Otwórz interfejs GUI Virtual Box, otwórz Ustawienia maszyny wirtualnej o nazwie
default
, otwórzShared Folders
sekcję i dodaj nowy folder współdzielony:D:\dev
d/dev
Naciśnij
OK
dwukrotnie i zamknij graficzny interfejs użytkownika Virtual Box.docker-machine start
).To wszystko. Wszystkie ścieżki hosta
D:\dev
powinny teraz działać wdocker-compose.yml
montowaniach.źródło
Można to zrobić połączenie czarownica z trzech narzędzi:
docker-machine mount
,rsync
,inotifywait
Powiedzmy, że masz swoje
docker-compose.yml
irun_web.sh
w/home/jdcaballerov/web
docker-machine machine:/home/jdcaballerov/web /tmp/some_random_dir
rsync -r /home/jdcaballerov/web /tmp/some_random_dir
Synchronizuj przy każdej zmianie plików w Twoim katalogu:
UWAŻAJ - istnieją dwa katalogi, które mają tę samą ścieżkę - jeden znajduje się na komputerze lokalnym (host), a drugi na komputerze docker.
źródło
Zakładam, że
run_web.sh
plik znajduje się w tym samym katalogu co twójdocker-compose.yml
plik. Wtedy polecenie powinno byćcommand: /app/run_web.sh
.Chyba że
Dockerfile
(którego nie ujawniasz) zajmie się umieszczeniemrun_web.sh
pliku w obrazie Dockera.źródło
Po podsumowaniu postów tutaj, dołączono zaktualizowany skrypt, aby utworzyć dodatkowy punkt montowania hosta i automatyczne montowanie po ponownym uruchomieniu Virtualbox. Opis środowiska pracy, jak poniżej: - Windows 7 - docker-machine.exe wersja 0.7.0 - VirtualBox 5.0.22
źródło
Używam docker-machine 0.12.2 z dyskiem virtualbox na moim komputerze lokalnym. Odkryłem, że istnieje katalog,
/hosthome/$(user name)
z którego masz dostęp do plików lokalnych.źródło
Pomyślałem, że wspomnę, że używam 18.03.1-ce-win65 (17513) w systemie Windows 10 i zauważyłem, że jeśli wcześniej udostępniłeś dysk i zapisałeś poświadczenia, po zmianie hasła docker zacznie mieć objętości zamontowane w pojemnikach jako puste.
Nie daje to żadnej wskazówki, że to, co faktycznie się dzieje, polega na tym, że nie ma teraz dostępu do udostępnionych poświadczeń z pamięci podręcznej. Rozwiązaniem w tym scenariuszu jest zresetowanie poświadczeń za pośrednictwem interfejsu użytkownika (Ustawienia-> Dyski współdzielone) lub wyłączenie, a następnie ponowne włączenie udostępniania dysku i wprowadzenie nowego hasła.
Byłoby użyteczne, gdyby docker-compose podał błąd w takich sytuacjach.
źródło