web-dev-qa-db-fra.com

Shell interactif utilisant Docker Compose

Existe-t-il un moyen de démarrer un shell interactif dans un conteneur en utilisant uniquement Docker Compose? J'ai essayé quelque chose comme ceci, dans mon docker-compose.yml:

myapp:
  image: Alpine:latest
  entrypoint: /bin/sh

Lorsque je démarre ce conteneur en utilisant docker-compose, il est immédiatement quitté. Existe-t-il des indicateurs que je peux ajouter à la commande entrypoint ou une option supplémentaire à myapp pour démarrer en tant que shell interactif?

Je sais qu’il existe des options de commande natives pour y parvenir, mais je voudrais seulement savoir s’il est possible d’utiliser Docker Compose également.

143
drubb

Vous devez inclure les lignes suivantes dans votre fichier docker-compose.yml:

stdin_open: true
tty: true

Le premier correspond à -i dans docker run et le second à -t.

193
leon.valencia

La manière canonique d'obtenir un shell interactif avec docker-compose est d'utiliser: docker-compose run --rm myapp

Vous pouvez définir stdin_open: true, tty: true, mais cela ne vous donnera pas réellement un Shell avec up, car les journaux sont diffusés depuis tous les conteneurs.

Vous pouvez aussi utiliser

docker exec -ti <container name> /bin/bash

obtenir un shell sur un conteneur en cours d'exécution.

125
dnephin

Dans l'exemple de démarrage officiel ( https://docs.docker.com/compose/gettingstarted/ ) avec le docker-compose.yml suivant:

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:Alpine"

Après avoir lancé ceci avec docker-compose up, vous pouvez facilement passer dans votre conteneur redis ou votre conteneur web avec:

docker-compose exec redis sh
docker-compose exec web sh 
28
clay

En utilisant docker-compose, j'ai trouvé que le moyen le plus simple de procéder consiste à créer un docker ps -a (après avoir démarré mes conteneurs avec docker-compose up) et à obtenir l'ID du conteneur pour lequel je souhaite avoir un shell interactif (appelons-le xyz123). 

Ensuite, c'est une chose simple à exécuter docker exec -ti xyz123 /bin/bash

et voila, un shell interactif. 

19
David Hersey

docker-compose run myapp sh devrait faire l'affaire.

Il y a une certaine confusion avec up/run, mais les documents docker-compose run ont une excellente explication: https://docs.docker.com/compose/reference/run

18
Alex Povar

Si quelqu'un de l'avenir s'interroge également ici:

docker-compose exec container_name sh

ou

docker-compose exec container_name bash

ou vous pouvez exécuter des lignes simples comme

docker-compose exec container_name php -v

C’est après que vos conteneurs soient déjà opérationnels.

4
Eleonora Ivanova

Vous pouvez faire docker-compose exec SERVICE_NAME sh sur la ligne de commande. Le SERVICE_NAME est défini dans votre fichier docker-compose.yml. Par exemple,

services:
    zookeeper:
        image: wurstmeister/zookeeper
        ports:
          - "2181:2181"

SERVICE_NAME serait zookeeper.

1
Yu N.