docker-compose для определенных контейнеров


161

У меня есть docker-compose.ymlнесколько контейнеров. Три из них предназначены для моего приложения (клиент, сервер и база данных), а остальные - для различных инструментов разработки (например, psql, npm, manage.py и т. Д.). Когда я делаю, docker-compose upвсе они запускаются, но я хочу, чтобы только три основных из них начали. Из-за ссылок, которые я указал, я могу начать только с этих трех, docker-compose up clientно тогда вывод будет только из этого одного контейнера. Итак, есть ли способ сделать одно из следующего:

  1. Скажите docker-compose, какие контейнеры должны быть запущены docker-compose up
  2. Получить вывод из всех связанных контейнеров из docker-compose up client

1
В соответствии с документами: docker-compose up [options] [SERVICE...]позволяет вам запускать любое подмножество услуг, которые вы хотите перечислить.
Джесси Чисхолм

Ответы:


258

Вы можете запустить контейнеры, используя:

$ docker-compose up -d client

Это будет запускать контейнеры в фоновом режиме и вывод будет доступен из

$ docker-compose logs

и он будет состоять из всех ваших запущенных контейнеров


11
Отлично. Просто сбросьте флаг -d, если вы хотите, чтобы логи отражались на stdout
Natus Drew

Можно ли запустить зависимый контейнер, если зависимый контейнер уже запущен и я не хочу его перезапускать?
majTheHero

43

Для запуска определенной службы, определенной в вашем файле docker-compose. например, если у вас есть docker-compose.yml

sudo docker-compose start db  

заданный файл составления как:

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:

Иногда вы хотите запустить только MySQL (иногда вы просто хотите заполнить базу данных), прежде чем запускать весь свой пакет.


9
Почему sudoраньше docker-compose ...? Это не обязательно, верно?
Йохем Шуленклоппер

1
если у вас нет пользователя в группе Docker, это будет необходимо.
Delpo

какая разница, если я использую sudo docker-compose up db вместоsudo docker-compose start db
Лук Арон

3
@LukAron - startпредполагает, что контейнер уже существует, и просто запускает его, upпри необходимости извлекает изображения, создает контейнеры, если необходимо, затем запускает контейнер.
Джесси Чисхолм


4

Одним из хороших решений является запуск только желаемых сервисов:

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

и файл services.txt выглядит так:

services1 services2, etc

Конечно, если зависимость (зависит_), необходимо запускать связанные службы вместе.

--build необязателен, например.


0

Начиная docker-composeс версии 1.5 возможно передавать несколько docker-compose.ymlфайлов с -fфлагом . Это позволяет вам разделить ваши инструменты разработки на отдельные, docker-compose.ymlкоторые вы затем включаете только по требованию:

# 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

Для подробного обсуждения этого см. Докер / состав # 1896 .

Я создал запрос на извлечение, чтобы добавить функциональность для достижения этого с гораздо большим удобством ( docker / compose # 7548 ), но, поскольку это требует изменения спецификации файла compose, это сейчас обсуждается в compose-spec / compose-spec # 87 .


-1

Вы обычно не хотите этого делать. С помощью Docker Compose вы определяете сервисы, которые составляют ваше приложение. npmи manage.pyпросто команды управления. Вам не нужен контейнер для них. Если вам нужно, скажем, создать таблицы базы данных с помощью manage.py, все, что вам нужно сделать, это:

docker-compose run client python manage.py create_db

Думайте об этом как об одноразовых династиях, которые использует Героку.

Если вам действительно нужно обрабатывать эти команды управления как отдельные контейнеры (а также использовать для них Docker Compose), вы можете создать отдельный .ymlфайл и запустить Docker Compose с помощью следующей команды:

docker-compose up -f my_custom_docker_compose.yml

15
Многие люди хотят сделать это.
Кодзиро

8
@ msrd0 Ты обычно не хочешь этого делать? Пусть люди решают сами!
Крис

1
На SO должно быть правило, что вы не можете понизить голос без объяснения причин. Поскольку это (или, по крайней мере, первая часть) имеет больше смысла, иметь дополнительный контейнер для каждой возможной команды управления очень странно.
thclark
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.