Popis dvou způsobů, jak sdílet adresáře mezi Windows a docker containery. První (jak se ukázalo, pro mě nepoužitelný) pomocí Samby, druhý pomocí sdílených složek VirtualBoxu.
Podle https://github.com/boot2docker/boot2docker#folder-sharing
docker run -v /data --name my-data busybox true
Vytvoří nový container pojmenovaný my-data se sdíleným adresářem (svazkem) /data
. Parametr true
na konci souvisí s tím, že vytvářím datový container (viz odpověď na SO).
Tento container slouží jako úložiště dat. Tedy nemazat!
docker run --rm -v /usr/local/bin/docker:/docker -v /var/run/docker.sock:/docker.sock svendowideit/samba my-data
Spustí nový dočasný (--rm
) container, který pomocí připojeného dockeru (--v
) vytvoří další container (automaticky pojmenovaný jako samba-server), ke kterému připojí všechny svazky datového containeru a nasdílí je pomocí Samby (viz dockerfile). Poslední parametr my-data
určuje název datového container, jehož data se mají sdílet.
Ve Windows příkazem boot2docker ip
zjistím IP adresu VM s dockerem. Na sdílená data se pak dostanu přes něco jako \\192.168.59.103\data
. Ve Windows můžu připojit sdílený adresář jako síťový disk:
net use z: \\192.168.59.103\data
Do jiných containerů můžu sdíledý adresář přidat pomocí přepínače --volumes-from
:
docker run -it --volumes-from my-data ubuntu
Z nějakého důvodu nelze z Windows do sdíleného adresáře zapisovat. Viz Issue #27
Řešením je připojit adresář k nějakému containeru (viz předchozí příkaz) a nastavit oprávnění příkazem chmod o+w /data
.
Výše popsaný způsob je sice funkční, ale pro mé potřeby nepoužitelný. Většina images dostupných v repository očekává při spuštění něco jako -v /data/my-project/www:/var/www/html
. Spuštěný container má pevně(?) daný pracovní adresář v cestě /var/www/html
, do které se namapuje adresář /data/my-project
z hostitelského systému. Jenže hostitelským systémem je v případě použití boot2docker virtuální linux, který při sdílení adresáře pomocí Samby nemá přístup ani k adresářům systému Windows, ani k adresáři sdílenému Sambou (pomocí mount
se mi ho nepodařilo připojit). Takže nemám žádnou cestu, kterou bych do parametru -v
mohl zadat. (I když asi by mělo fungovat řešení s docker inspect
zmíněné v dalším odstavci.)
Použitelný není ani parametr --volumes-from
. Ten způsobí, že se do containeru připojí všechny svazky (volumes), tak jak tam jsou. Mám-li tedy datový container my-data vytvořen jako -v /data
, pak --volumes-from my-data
v containeru připojí opět svazek /data
. Ale opět nemám jak říct, že /data/my-project/www
má být /var/www/html
. Aspoň tedy ne jednoduchým a použitelným způsobem. Na SO je popsáno řešení s docker inspect
, pomocí něhož se dohledá plná cesta svazku z datového containeru (např. /mnt/sda1/var/lib/docker/volumes/b0b723ddbcaceb0c4cbed12c4ad6c54e4947f7cdf0acb4d1cfbe98a8afea30ad/_data
, která se pak použije v parametru -v
. Do budoucna snad něco takového bude podporovat přímo docker: Proposal #8484.
Popsáno v https://github.com/boot2docker/boot2docker#virtualbox-guest-additions, využívá VirtualBox Guest Additions (viz manuál).
Boot2docker (verze 1.7.0) na Windows automaticky sdílí adresář C:\Users
pod názvem c/Users, který je připojen jako /c/Users
. (Automatické připojení zajišťuje script /etc/rc.d/automount-shares
.)
Ovšem já nechci mít data v adresáři C:\Users
a psát pak něco jako -v /c/Users/vhenzl/projects/my-project/www:/var/www/html
, chci je mít v C:\Data\Docker
(přičemž plná cesta ke konkrétnímu projektu vypadá třeba C:\Data\Docker\projects\my-project
). Jsou zde dvě možnosti.
-
Upravit stávající sdílení. Název nastavit na Users, cestu na
C:\Data\Docker
. Script pro automount pak automaticky připojí můj adresář s daty jako/Users
, takže pak můžu používat cestu/Users/projects/my-project
. -
Nechat stávající sdílení, tak jak je, a přidat nové. Toho docílím příkazem:
VBoxManage sharedfolder add "boot2docker-vm" --name "docker-data" --hostpath "C:\Data\Docker" --automount
boot2docker-vm je název VM s dockerem ve VirtualBoxu, --name
určuje název sdílení, --hostpath
adresář, který se má sdílet. Alternativně je možné přidat sdílenou složku přes GUI VirtualBoxu (Nastavení, záložka Sdílené složky).
Ačkoliv je při vytváření sdílení použitý příznak --automount
, sdílení není automaticky připojeno (boot2docker to zatím neumí) a musím jej po spuštění virtuálního systému připojit ručně:
sudo mount -t vboxsf -o uid=1000,gid=50 docker-data /data
Nyní mám svoje data dostupná pod /data
, konkrétní projekt pak v adresáři /data/projects/my-project
. Budu-li chtít spustit web v containeru, nasdílím mu data parametrem -v /data/projects/my-project/www:/var/www/html
.
Připojení sdíleného adresáře ale není trvalé, příkaz mount
je potřeba spustit po každém restaru virtuálního systému. To je nepohodlné a chtělo by to nějak zautomatizovat.
Standardním řešením by bylo vytvořit script v /etc/rc.d
. Toto ale nefunguje pro Boot2Docker VM, systém běží z RAM a žádné změny mimo /var/lib/docker
a /var/lib/boot2docker
se neukádají. Pokud tedy chceme spustit nějaký příkaz po startu virtuálního systému, můžeme tak učinit skrze soubor /var/lib/boot2docker/bootlocal.sh
(viz Boot2Docker FAQ).
Vytvořením scriptu bootlocal.sh
s následujícím obsahem zajistíme, že se sdílený adresář připojí po každém startu Boot2Docker VM.
#!/bin/sh
mkdir -p /data
mount -t vboxsf -o uid=1000,gid=50 docker-data /data