docker-композиція лише для певних контейнерів


161

У мене є docker-compose.ymlякий містить кілька контейнерів. Три з них - для мого додатка (клієнт, сервер і база даних), а решта - для різних інструментів розробника (наприклад, psql, npm, Manag.py тощо). Коли я це роблю, docker-compose upусі вони починаються, але я хочу лише три основні. Через вказані вами посилання я можу запустити саме ті три з, docker-compose up clientале тоді вихід є лише з цього одного контейнера. Отже, чи є спосіб зробити одне з наступного:

  1. Скажіть докер-складі, які контейнери слід починати docker-compose up
  2. Отримайте вихід із усіх пов'язаних контейнерів docker-compose up client

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

Відповіді:


257

Ви можете запустити контейнери, використовуючи:

$ docker-compose up -d client

Це запустить контейнери у фоновому режимі, і вихід буде доступний з

$ docker-compose logs

і він буде складатися з усіх запущених контейнерів


11
Ідеально. Просто скиньте прапор -d, якщо ви хочете, щоб журнали перегукувались з stdout
Natus Drew

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

43

Щоб запустити певну послугу, визначену у вашому докер-файлі. наприклад, якщо у вас є 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
якщо у вас немає користувача в групі докерів, так, це було б необхідно.
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-composev1.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 .

Я створив запит на витяг, щоб додати функціональність, щоб досягти цього з набагато більшою зручністю ( докер / композит № 7548 ), але оскільки для цього потрібна зміна специфікації файлу для складання, це зараз обговорюється в 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
Дуже багато людей хочуть це зробити.
kojiro

8
@ msrd0 Ви зазвичай цього не хочете робити? Нехай люди самі вирішують!
Кріс,

1
Повинно існувати правило про те, що ти не можеш звернути увагу, не пояснивши чому. Оскільки це (або принаймні перша частина) має найбільш сенс, мати додатковий контейнер для кожної можливої ​​команди управління - дуже дивно.
thclark
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.