docker run: dlaczego używać --rm (nowicjusz docker)

110

Po raz pierwszy próbuję dokera i nie mam jeszcze „modelu mentalnego”. Całkowicie początkujący.

Wszystkie przykłady, na które patrzę, zawierały --rmflagę do uruchomienia, taką jak

docker run -it --rm ...
docker container run -it --rm ...

Pytanie:

Dlaczego te polecenia zawierają --rmflagę? Pomyślałbym, że gdybym miał kłopoty z konfiguracją lub ściągnięciem kontenera z dobrymi rzeczami, po co go usuwać? Chcę go zachować do ponownego użycia.

Więc wiem, że mam zły pomysł na docker.

pasujące chwile
źródło
6
--rmusuwa zatrzymany kontener (ten utworzony docker run), a nie obraz, na którym został oparty (co pobrałeś).
Ry-
docker run --helppowinno być przydatne. Jeśli nie chcesz usuwać kontenera , możesz go przekazać
indapublic
1
musi być --rmi ma to na celu automatyczne czyszczenie kontenera i usuwanie systemu plików, gdy kontener się kończy, co nie oznacza usunięcia rzeczy z kontenera.
Mahattam,
2
Nie pobierasz kontenerów, pobierasz obrazy. Przeczytaj tutaj, aby poznać różnice między obrazami a kontenerami: docs.docker.com/engine/docker-overview/#docker-objects
axiac

Odpowiedzi:

98

Kontenery to tylko przykład obrazu, którego używasz do ich uruchamiania. Stan umysłu podczas tworzenia aplikacji kontenerowej nie polega na przykład na pobraniu świeżego, czystego kontenera Ubuntu i pobraniu aplikacji i konfiguracji, które chcesz w nim mieć, a następnie uruchomieniu.

Kontener należy traktować jako wystąpienie aplikacji, ale aplikacja jest osadzona w obrazie. Właściwym użyciem byłoby utworzenie niestandardowego obrazu, w którym osadzasz wszystkie swoje pliki, konfiguracje, zmienne środowiskowe itp. W obrazie. Przeczytaj więcej o Dockerfile i jak to się robi tutaj

Gdy to zrobisz, masz obraz, który zawiera wszystko, a aby użyć aplikacji, po prostu uruchom obraz z odpowiednimi ustawieniami portu lub innymi zmiennymi dynamicznymi, używając docker run <your-image>

Uruchamianie kontenerów z --rmflagą jest dobre dla tych kontenerów, których używasz przez bardzo krótki czas, aby coś zrobić, np. Skompilować aplikację w kontenerze lub po prostu przetestować coś, co działa, a wtedy wiesz, że jest to kontener krótkotrwały i ty powiedz swojemu demonowi Docker, że po zakończeniu działania usuń wszystko z nim związane i zaoszczędź miejsce na dysku.

kolego123
źródło
Lepszą alternatywą byłoby przekazanie zmiennych środowiskowych do działania dockera. W ten sposób możesz zacząć od różnych konfiguracji (np. Produkcja kontra przedprodukcja)?
SCO,
Prod vs środowisku testowym jest dobry przykład, gdzie będzie prawdopodobnie chcesz użyć env vars dokonać rozdzielenia i dostać swoją aplikację do uruchamiania z tego samego obrazu, ale z różnymi ustawieniami dla każdego env
buddy123
Czy istnieje sposób na automatyczne usuwanie kontenerów, które są uruchamiane, --rmgdy użytkownik zamyka okno terminala. tj. nie jest celowo uruchamiany exitw powłoce kontenera, ale po prostu zamyka okno terminala GUI. Zauważyłem, że w tym przypadku kontenery nie są usuwane.
venkrao
20

Flaga --rmjest używana, gdy zachodzi potrzeba usunięcia kontenera po zakończeniu zadania.

Jest to odpowiednie do małych testów lub celów POC i oszczędza ból głowy podczas prowadzenia domu.

Adnan Khan
źródło
16

z https://docs.docker.com/engine/reference/run/#clean-up---rm

Domyślnie system plików kontenera utrzymuje się nawet po zamknięciu kontenera. To znacznie ułatwia debugowanie (ponieważ możesz sprawdzić stan końcowy) i domyślnie zachowujesz wszystkie dane. Ale jeśli uruchamiasz krótkoterminowe procesy pierwszoplanowe, te systemy plików kontenerów mogą naprawdę się nagromadzić. Jeśli zamiast tego chcesz, aby Docker automatycznie czyścił kontener i usuwał system plików po zamknięciu kontenera, możesz dodać flagę --rm

Krótko mówiąc: warto utrzymywać hosta w czystości przed zatrzymanymi i nieużywanymi kontenerami.

Sandro Modarelli
źródło
1

Używam --rmpodczas łączenia się z uruchomionymi kontenerami w celu wykonania niektórych czynności, takich jak tworzenie kopii zapasowych bazy danych lub kopiowanie plików. Oto przykład:

docker run -v $(pwd):/mnt --link app_postgres_1:pg --rm postgres:9.5 pg_dump -U postgres -h pg -f /mnt/docker_pg.dump1 app_db

Powyższe spowoduje połączenie działającego kontenera o nazwie „app_postgres_1” i utworzenie kopii zapasowej. Po wykonaniu polecenia tworzenia kopii zapasowej kontener jest całkowicie usuwany.

Shoan
źródło