Czy powinienem używać docker-compose up czy uruchamiać?

136

Czy jest jakiś powód, aby runuruchomić docker-compose.ymlplik, czy po prostu użyć up?

Rozumiem, że runmożna uruchomić określony kontener, ale odnoszę się do przypadku, w którym używasz go bez określania kontenera, aby uruchamiał wszystkie twoje kontenery yml.

Raif
źródło

Odpowiedzi:

145

Jak wspomniano w docker-compose run(2015)

Polecenie przekazane przez polecenie run zastępuje polecenie zdefiniowane w konfiguracji usługi .
Na przykład, jeśli konfiguracja usługi sieci Web została uruchomiona z bash, docker-compose run web python app.pyzastępuje ją za pomocą python app.py.

Druga różnica polega na tym, że docker-compose runpolecenie nie tworzy żadnego z portów określonych w konfiguracji usługi .
Zapobiega to kolizjom portów z już otwartymi portami. Jeśli chcesz, aby porty usługi zostały utworzone i zmapowane do hosta, określ flagę --service-ports:

$ docker-compose run --service-ports web python manage.py shell

Więc jeśli nie masz tych konkretnych potrzeb (przesłonięcie polecenia lub uruchomienie tylko jednego kontenera na różnych portach), docker-compose up(nawet dla jednego kontenera) wystarczy.

Czy możesz pomóc wyjaśnić, dlaczego lub kiedy nie chcesz, aby porty były tworzone? Dlatego lub kiedy mogą one kolidować z już otwartymi portami

Po prostu dlatego, że docker-compose runjest stworzony do uruchamiania jednorazowych poleceń dla twoich usług.
Oznacza to, że jeśli już to zrobiłeś docker-compose up, wszystkie twoje kontenery działają już na określonych portach z docker-compose.yml.
Wykonanie docker-compose runna tym etapie (w celu wykonania jednorazowego polecenia), gdyby dotyczyło tego samego portu, natychmiast się nie powiedzie. Stąd domyślne nietworzenie tych portów.


Inny przypadek użycia (w odwołaniu do zmiennych środowiskowych Compose ):

Aby zobaczyć, jakie zmienne środowiskowe są dostępne dla usługi, uruchom docker-compose run SERVICE env.


Najnowsza (2019+) wersja tych poleceń jest włączona docker/docker.github.io:

VonC
źródło
28

Chciałbym zwrócić uwagę, że jeśli używasz Pythona z debugerem pdb:

import pdb; pdb.set_trace()

Nie spadnie do powłoki, jeśli wykonasz skrypt za pomocą:

docker-compose up

Jeśli jednak użyjesz run, spadnie on do debugera zgodnie z oczekiwaniami:

docker-compose run
quickinsights
źródło
8

Jest odpowiedź z docker docs .

Zazwyczaj chcesz docker-compose up. Służy updo uruchamiania lub ponownego uruchamiania wszystkich usług zdefiniowanych w docker-compose.yml. W domyślnym trybie „dołączonym” widoczne są wszystkie dzienniki ze wszystkich kontenerów. W trybie „odłączonym” ( -d) funkcja Compose kończy pracę po uruchomieniu kontenerów, ale kontenery nadal działają w tle.

docker-compose runKomenda jest do prowadzenia „one-off” lub zadania „AdHoc”. Wymaga nazwy usługi, którą chcesz uruchomić, i uruchamia kontenery tylko dla usług, od których zależy działająca usługa. Służy run do uruchamiania testów lub wykonywania czynności administracyjnych, takich jak usuwanie lub dodawanie danych do kontenera woluminu danych. runKomenda działa jak docker run -tiw to, że otwiera interaktywny terminal do pojemnika i zwraca kod zakończenia pasujący kod zakończenia procesu w pojemniku.

Sójka
źródło
1
To powinna być akceptowana odpowiedź. Zasadniczo służy docker-compose rundo wykonywania poleceń względem działającej usługi i docker-compose updo tworzenia nowej usługi.
goonerify