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.

 124
Author: Rob Bednark, 2015-01-01

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ępnie RUN 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ąc VOLUME /var/log/my_app do pliku Dockerfile, a następnie uruchamiając kontener z docker 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.
 198
Author: Eli,
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:

  1. docker run -v /data: jest to analogiczne do określenia instrukcji VOLUME w pliku Dockerfile.
  2. 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.
  3. docker run -v my_volume:$container_path: tworzy wolumin danych w kontenerze pod adresem $container_path i nazywa go my_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.

 27
Author: ivan.sim,
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