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.
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
.
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.
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
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.
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
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.
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.