docker-composer pour seulement certains conteneurs

161

J'ai un docker-compose.ymlqui contient plusieurs conteneurs. Trois d'entre eux sont destinés à mon application (client, serveur et base de données) et les autres sont destinés à divers outils de développement (par exemple psql, npm, manage.py, etc.). Quand je les fais, docker-compose uptous commencent, mais je veux que les trois principaux commencent. En raison des liens que j'ai spécifiés, je ne peux démarrer que ces trois éléments, docker-compose up clientmais la sortie ne provient que de ce conteneur. Alors, y a-t-il un moyen de faire l'une des choses suivantes:

  1. Dites à docker-compose quels conteneurs doivent être démarrés par docker-compose up
  2. Obtenir la sortie de tous les conteneurs liés à partir de docker-compose up client
Eau de vie
la source
1
Selon la documentation: docker-compose up [options] [SERVICE...]vous permet de démarrer le sous-ensemble de services que vous souhaitez lister.
Jesse Chisholm le

Réponses:

258

Vous pouvez démarrer des conteneurs en utilisant:

$ docker-compose up -d client

Cela exécutera les conteneurs en arrière-plan et la sortie sera disponible à partir de

$ docker-compose logs

et il sera composé de tous vos conteneurs démarrés

WSL
la source
11
Parfait. Lâchez simplement le drapeau -d si vous voulez voir les journaux répercutés sur stdout
Natus Drew
Est-il possible de démarrer un conteneur dépendant, si le conteneur de dépendance est déjà en cours d'exécution et que je ne souhaite pas le redémarrer?
majTheHero
43

Pour démarrer un service particulier défini dans votre fichier docker-compose. par exemple si vous avez un docker-compose.yml

sudo docker-compose start db  

étant donné un fichier de composition comme:

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:

Parfois, vous souhaitez démarrer uniquement mySQL (parfois vous souhaitez simplement remplir une base de données) avant de démarrer toute votre suite.

Hugo R
la source
9
Pourquoi sudoavant docker-compose ...? Ce n'est pas nécessaire, non?
Jochem Schulenklopper
1
si vous n'avez pas votre utilisateur dans le groupe de menu fixe oui, ce serait nécessaire.
delpo
quelle est la différence si j'utilise à la sudo docker-compose up db place desudo docker-compose start db
Luk Aron
3
@LukAron - startsuppose que le conteneur existe déjà et le démarre simplement, uptirera des images si nécessaire, créera des conteneurs si nécessaire, puis démarrera le conteneur.
Jesse Chisholm le
10

Oh, juste avec ceci:

$ docker-compose up client server database
rappongy
la source
4

Une bonne solution consiste à exécuter uniquement les services souhaités comme celui-ci:

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

et le fichier services.txt ressemble à ceci:

services1 services2, etc

bien sûr, si la dépendance (depend_on), vous devez exécuter les services associés ensemble.

--build est facultatif, par exemple.

matinfo
la source
0

Depuis la docker-composev1.5, il est possible de transmettre plusieurs docker-compose.ymlfichiers avec l' -findicateur . Cela vous permet de diviser vos outils de développement en un autre docker-compose.ymlque vous n'incluez ensuite qu'à la demande:

# 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

Pour une discussion approfondie à ce sujet, voir docker / compose # 1896 .

J'ai créé une pull request pour ajouter une fonctionnalité pour y parvenir avec beaucoup plus de commodité ( docker / compose # 7548 ), mais comme cela nécessite une modification de la spécification du fichier de composition, cela est maintenant discuté à compose-spec / compose-spec # 87 .

acran
la source
-1

Vous ne voulez généralement pas faire cela. Avec Docker Compose, vous définissez les services qui composent votre application. npmet ne manage.pysont que des commandes de gestion. Vous n'avez pas besoin d'un conteneur pour eux. Si vous avez besoin de, disons créer vos tables de base de données avec manage.py, tout ce que vous avez à faire est:

docker-compose run client python manage.py create_db

Considérez-le comme le dynos unique qu'utilise Heroku.

Si vous avez vraiment besoin de traiter ces commandes de gestion comme des conteneurs séparés (et d'utiliser également Docker Compose pour ceux-ci), vous pouvez créer un .ymlfichier séparé et démarrer Docker Compose avec la commande suivante:

docker-compose up -f my_custom_docker_compose.yml
linkyndy
la source
15
Beaucoup de gens veulent faire ça.
kojiro
8
@ msrd0 Vous ne voulez généralement pas faire ça? Laissez les gens décider eux-mêmes!
Kris
1
Il devrait y avoir une règle sur le SO que vous ne pouvez pas voter sans expliquer pourquoi. Parce que cela (ou du moins la première partie) a le plus de sens, avoir un conteneur supplémentaire pour chaque commande de gestion possible est super bizarre.
thclark