docker-compose dla tylko niektórych kontenerów

161

Mam docker-compose.ymlktóry zawiera kilka pojemników. Trzy z nich są przeznaczone dla mojej aplikacji (klient, serwer i baza danych), a pozostałe są przeznaczone dla różnych narzędzi programistycznych (np. Psql, npm, manage.py itp.). Kiedy robię, docker-compose upwszystkie są uruchamiane, ale chcę, aby zaczęły się tylko trzy główne. Ze względu na linki, które określiłem, mogę zacząć tylko od tych trzech, docker-compose up clientale wtedy dane wyjściowe pochodzą tylko z tego jednego kontenera. Czy można więc wykonać jedną z następujących czynności:

  1. Poinformuj docker-compose, od których kontenerów ma się zacząć docker-compose up
  2. Pobierz dane wyjściowe ze wszystkich połączonych kontenerów z docker-compose up client
Aqua vitae
źródło
1
Zgodnie z dokumentacją: docker-compose up [options] [SERVICE...]pozwala rozpocząć dowolny podzbiór usług, które chcesz wymienić.
Jesse Chisholm

Odpowiedzi:

257

Możesz rozpocząć kontenery, używając:

$ docker-compose up -d client

Spowoduje to uruchomienie kontenerów w tle, a dane wyjściowe będą dostępne z

$ docker-compose logs

i będzie się składał ze wszystkich rozpoczętych kontenerów

wsl
źródło
11
Idealny. Po prostu upuść flagę -d, jeśli chcesz, aby dzienniki powracały do ​​standardowego wyjścia
Natus Drew
Czy można uruchomić kontener zależny, jeśli kontener zależności już działa i nie chcę go ponownie uruchamiać?
majTheHero
43

Aby uruchomić określoną usługę zdefiniowaną w pliku Docker-Compose. na przykład jeśli masz plik docker-compose.yml

sudo docker-compose start db  

mając plik redagowania, taki jak:

version: '3.3'

services:
   db:
     image: mysql:5.7
     ports:
       - "3306:3306"
     volumes:
       - ./db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: yourPassword
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: yourPassword

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "80:80"
     volumes:
       - ./l3html:/var/www/html
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: yourPassword
volumes:
    db_data:
    l3html:

Czasami chcesz uruchomić tylko mySQL (czasami po prostu chcesz wypełnić bazę danych) przed uruchomieniem całego pakietu.

Hugo R.
źródło
9
Dlaczego sudowcześniej docker-compose ...? To nie jest konieczne, prawda?
Jochem Schulenklopper
1
jeśli nie masz użytkownika w grupie docker, tak, byłoby to konieczne.
delpo
jaka różnica, jeśli użyję sudo docker-compose up db zamiastsudo docker-compose start db
Luk Aron
3
@LukAron - startzakłada, że ​​kontener już istnieje i po prostu go uruchamia, w uprazie potrzeby pobierze obrazy, w razie potrzeby utworzy kontenery, a następnie uruchomi kontener.
Jesse Chisholm
10

Och, tylko z tym:

$ docker-compose up client server database
rappongy
źródło
4

Dobrym rozwiązaniem jest uruchamianie tylko pożądanych usług, takich jak ta:

docker-compose up --build $(<services.txt)

i services.txt wyglądają następująco:

services1 services2, etc

oczywiście, jeśli zależność (depends_on), musi wspólnie uruchamiać powiązane usługi.

--build jest opcjonalne, tylko na przykład.

matinfo
źródło
0

Od wersji docker-compose1.5 możliwe jest przekazywanie wielu docker-compose.ymlplików z -fflagą . Dzięki temu możesz podzielić narzędzia deweloperskie na osobne, docker-compose.ymlktóre następnie dołączasz tylko na żądanie:

# start and attach to all your essential services
docker-compose up

# execute a defined command in docker-compose.dev.yml
docker-compose -f docker-compose.dev.yml run npm update

# if your command depends_on a service you need to include both configs
docker-compose -f docker-compose.yml -f docker-compose.dev.yml run npm update

Aby uzyskać dogłębną dyskusję na ten temat, zobacz docker / compose # 1896 .

Utworzyłem żądanie ściągnięcia, aby dodać funkcjonalność umożliwiającą osiągnięcie tego z dużo większą wygodą ( docker / compose # 7548 ), ale ponieważ wymaga to zmiany specyfikacji pliku redagowania, jest to teraz omówione w compose-spec / compose-spec # 87 .

acran
źródło
-1

Zwykle nie chcesz tego robić. Za pomocą Docker Compose definiujesz usługi, które tworzą Twoją aplikację. npmi manage.pysą tylko poleceniami zarządzania. Nie potrzebujesz do nich pojemnika. Jeśli potrzebujesz, powiedzmy, utwórz tabele bazy danych za pomocą manage.py, wszystko, co musisz zrobić, to:

docker-compose run client python manage.py create_db

Pomyśl o tym jak o jednorazowych hamowniach Heroku.

Jeśli naprawdę potrzebujesz traktować te polecenia zarządzania jako oddzielne kontenery (a także używać do nich Docker Compose), możesz utworzyć oddzielny .ymlplik i uruchomić Docker Compose za pomocą następującego polecenia:

docker-compose up -f my_custom_docker_compose.yml
linkyndy
źródło
15
Wiele osób chce to zrobić.
kojiro
8
@ msrd0 Zwykle nie chcesz tego robić? Pozwól ludziom decydować za siebie!
Kris
1
Powinna istnieć zasada dotycząca SO, że nie można głosować przeciw bez wyjaśnienia dlaczego. Ponieważ to (a przynajmniej pierwsza część) ma największy sens, posiadanie dodatkowego kontenera na każde możliwe polecenie zarządzania jest bardzo dziwne.
thclark