Skip to content

Instantly share code, notes, and snippets.

@vhenzl
Last active August 29, 2015 14:24
Show Gist options
  • Save vhenzl/8bb5966029c6e4d20304 to your computer and use it in GitHub Desktop.
Save vhenzl/8bb5966029c6e4d20304 to your computer and use it in GitHub Desktop.
Docker: Sdílení souborů mezi containery a Windows

Docker: Sdílení souborů mezi containery a Windows

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.

Sdílení pomocí Samby (image svendowideit/samba)

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.

Sdílení pomocí sdílených složek VirtualBoxu

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.

  1. 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.

  2. 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.

Automatické připojení sdíleného adresáře po startu VM

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment