Docker ADD vs VOLUME
Uczę się Dockera i mam wątpliwości, kiedy i gdzie używać ADD
i VOLUME
. Oto, co myślę, że oba z nich zrobić:
Dodaj
Kopiuj pliki do obrazu w czasie budowania. Obraz zawiera wszystkie pliki, dzięki czemu można bardzo łatwo wdrożyć. Z drugiej strony, potrzeba budowania za każdym razem nie wygląda na dobry pomysł w rozwoju, ponieważ budowanie wymaga od dewelopera uruchomienia polecenia, aby odbudować kontener; dodatkowo, budowanie kontenera może być czasochłonne.
Objętość
Rozumiem, że za pomocą docker run -v
można zamontować folder hosta wewnątrz kontenera, w ten sposób można łatwo modyfikować pliki i obserwować, jak aplikacja w kontenerze reaguje na zmiany. Wygląda świetnie w rozwoju, ale nie jestem pewien, jak wdrożyć moje pliki w ten sposób.
2 answers
Dodaj
Zasadnicza różnica między tymi dwoma jest taka, że ADD
sprawia, że cokolwiek dodajesz, czy to folder, czy tylko plik faktycznie część Twojego obrazu . Każdy, kto użyje obrazu, który później zbudowałeś, będzie miał dostęp do tego, co ty ADD
. Jest to prawdą, nawet jeśli później go usuniesz, ponieważ Docker działa na warstwach, a warstwa ADD
nadal będzie istnieć jako część obrazu. Żeby było jasne, tylko ADD
coś w czasie budowy i nigdy nie może ADD
w czasie uruchomienia.
Kilka przykładów przypadków, w których chciałbyś użyć ADD
:
- masz pewne wymagania w wymaganiach.plik txt, do którego chcesz się odwołać i który chcesz zainstalować w pliku Dockerfile. Następnie możesz wykonać:
ADD ./requirements.txt /requirements.txt
, a następnieRUN pip install -r /requirements.txt
-
Chcesz użyć kodu aplikacji jako kontekstu w pliku Dockerfile, na przykład, jeśli chcesz ustawić katalog aplikacji jako katalog roboczy w obrazie i mieć domyślne polecenie w kontenerze uruchamiane z obrazu, aby uruchomić aplikację, można zrobić:
ADD ./ /usr/local/git/my_app
WORKDIR /usr/local/git/my_app
CMD python ./main.py
Objętość
Z drugiej strony wolumin pozwala kontenerowi uruchamianemu z obrazu mieć dostęp do ścieżki na dowolnej lokalnej maszynie, na której kontener jest uruchamiany. Nie można używać plików z katalogu VOLUME
w pliku Dockerfile. Wszystko w katalogu woluminów będzie niedostępne w czasie kompilacji, Ale będzie dostępne w czasie wykonywania .
Kilka przykłady przypadków, w których chcesz użyć VOLUME
:
- aplikacja uruchomiona w kontenerze tworzy logi
/var/log/my_app
. Chcesz, aby dzienniki te były dostępne na komputerze hosta i nie były usuwane po usunięciu kontenera. Można to zrobić, tworząc punkt montowania w/var/log/my_app
, dodającVOLUME /var/log/my_app
do pliku Dockerfile, a następnie uruchamiając kontener zdocker run -v /host/log/dir/my_app:/var/log/my_app some_repo/some_image:some_tag
- masz pliki ustawień lokalnych, do których ma mieć dostęp aplikacja w kontenerze. Być może te ustawienia pliki są różne na twojej lokalnej maszynie vs dev vs production. Szczególnie, jeśli te Pliki Ustawień są tajne, w takim przypadku zdecydowanie nie chcesz ich w swoim obrazie. Dobrą strategią w tym przypadku jest dodanie
VOLUME /etc/settings/my_app_settings
do pliku Dockerfile, uruchomienie kontenera za pomocądocker run -v /host/settings/dir:/etc/settings/my_app_settings some_repo/some_image:some_tag
i upewnienie się, że katalog/host/settings / istnieje we wszystkich środowiskach, w których aplikacja ma być uruchomiona.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-23 23:03:47
Instrukcja VOLUME
tworzy wolumin danych w kontenerze dokera w czasie wykonywania. Katalog podany jako argument VOLUME
jest katalogiem, który omija Union File System i jest używany przede wszystkim dla danych trwałych i współdzielonych.
Jeśli uruchomisz docker inspect <your-container>
, zobaczysz w sekcji Mounts
Source
, która reprezentuje lokalizację katalogu na hoście i Destination
, która reprezentuje lokalizację zamontowanego katalogu w kontenerze. Na przykład,
"Mounts": [
{
"Name": "fac362...80535",
"Source": "/var/lib/docker/volumes/fac362...80535/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
Oto 3 przypadki użycia dla docker run -v
:
-
docker run -v /data
: jest to analogiczne do określenia instrukcjiVOLUME
w pliku Dockerfile. -
docker run -v $host_path:$container_path
: pozwala to zamontować$host_path
z hosta do$container_path
w kontenerze podczas wykonywania. W fazie rozwoju jest to przydatne do udostępniania kodu źródłowego na komputerze z kontenerem. W produkcji, może być używany do montowania takich rzeczy jak informacje DNS hosta (Znalezione w/etc/resolv.conf
) lub tajemnice do kontenera. Z drugiej strony, można również użyć tej techniki do zapisu dzienników kontenera w określonych folderach na hoście. Zarówno$host_path
jak i$container_path
muszą być ścieżkami absolutnymi. -
docker run -v my_volume:$container_path
: tworzy wolumin danych w kontenerze pod adresem$container_path
i nazywa gomy_volume
. Jest to zasadniczo to samo, co tworzenie i nazywanie woluminu za pomocądocker volume create my_volume
. Nazwanie woluminu takiego jak ten jest przydatne dla woluminu danych kontenera i woluminu współdzielonego przy użyciu sterownika pamięci masowej z wieloma hostami, takiego jak Flocker .
Zauważ, że sposób montowania folderu host jako woluminu danych nie jest dostępny w pliku Dockerfile. Aby zacytować dokumentację Dockera ,
Uwaga: plik ten nie jest dostępny z pliku Dockerfile ze względu na przenośność i cel udostępniania. Ponieważ katalog hosta jest ze swej natury zależny od hosta, katalog hosta określony w pliku Dockerfile prawdopodobnie nie będzie działał na wszystkich hostach.
Teraz jeśli chcesz skopiować swoje pliki do kontenerów w środowiskach innych niż deweloperskie, możesz użyć instrukcji ADD
lub COPY
w pliku Dockerfile. To jest to, czego zwykle używam do wdrażania non-development.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-10 05:07:33