Existe-t-il un moyen de démarrer un shell interactif dans un conteneur à l'aide de Docker Compose uniquement? J'ai essayé quelque chose comme ça, dans mon docker-compose.yml:
myapp:
image: alpine:latest
entrypoint: /bin/sh
Lorsque je démarre ce conteneur en utilisant docker-compose up, il se ferme immédiatement. Existe-t-il des indicateurs que je peux ajouter à la commande entrypoint, ou en tant qu'option supplémentaire à myapp, pour démarrer en tant que shell interactif?
Je sais qu'il existe des options de commande native docker pour y parvenir, juste curieux de savoir s'il est possible d'utiliser uniquement Docker Compose également.
/bin/sh
point d' entrée dans votre fichier de composition, que doit-il faire?docker-compose run myapp
?docker-compose run myapp
c'est qu'il n'exposera pas les ports. Il faut donc utiliserdocker-compose run --service-ports myapp
mais ce n'est pas très pratique.entrypoint: /bin/sh
devrait êtreentrypoint: "/bin/sh"
Réponses:
Vous devez inclure les lignes suivantes dans votre docker-compose.yml:
Le premier correspond à
-i
indocker run
et le second à-t
.la source
stdin_open
le lien manquant, pour me fournir simplement le comportement attendu lorsque je me connecte à l'un de mes conteneurs qui exécute déjà un shell.docker-compose run <service_name>
docker exec
dessus ne fonctionnera pas.colorama\win32.py, line 152, in SetConsoleTitle: ctypes.ArgumentError: ‘ValueError’: embedded null character
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
, cependant, cela ne vous donnera pas un shell appropriéup
, car les journaux sont diffusés à partir de tous les conteneurs.Vous pouvez aussi utiliser
pour obtenir un shell sur un conteneur en cours d'exécution.
la source
--service-ports
si vous exposez des ports (par exemple pour un serveur Web)--rm
indicateur afin que le conteneur soit supprimé. La réponse de @ lynx0123 n'est pas correcte. Vous n'obtiendrez pas de shell interactif si vous exécutezdocker-compose up
.docker-compose run
. Vous souhaiterez également ajoutercommand: /bin/bash
à docker-compose.yml.Dans l'exemple de démarrage officiel ( https://docs.docker.com/compose/gettingstarted/ ) avec ce qui suit
docker-compose.yml
:Après avoir commencé avec
docker-compose up
, vous pouvez facilement décortiquer dans votreredis
conteneur ou votreweb
conteneur avec:la source
docker-compose run myapp sh
devrait faire l'affaire.Il y a une certaine confusion avec
up
/run
, mais lesdocker-compose run
documents ont une bonne explication: https://docs.docker.com/compose/reference/runla source
En utilisant docker-compose, j'ai trouvé que la façon la plus simple de le faire est de faire un
docker ps -a
(après avoir démarré mes conteneurs avecdocker-compose up
) et d'obtenir l'ID du conteneur dans lequel je veux avoir un shell interactif (appelons-le xyz123).Ensuite, c'est une question simple à exécuter
docker exec -ti xyz123 /bin/bash
et le tour est joué, un shell interactif.
la source
Si quelqu'un du futur erre aussi ici:
ou
ou vous pouvez exécuter des lignes simples comme
C'est après que vous ayez déjà vos conteneurs opérationnels
la source
Vous pouvez le faire
docker-compose exec SERVICE_NAME sh
sur la ligne de commande. LeSERVICE_NAME
est défini dans votredocker-compose.yml
. Par exemple,Ce
SERVICE_NAME
serait "gardien de zoo".la source
Cette question est très intéressante pour moi car j'ai des problèmes, lorsque j'exécute le conteneur une fois l'exécution terminée, quittez immédiatement et j'ai corrigé avec -it:
Et quand je dois l'automatiser avec Docker, composez:
Cela rend l'astuce: stdin_open: true, tty: true
Ceci est un projet généré avec create-react-app
Dockerfile.dev il semble que:
J'espère que cet exemple aidera d'autres à exécuter un frontend (réagir dans l'exemple) dans le conteneur docker.
la source
Si le
yml
est appelé,docker-compose.yml
il peut être lancé avec un simple$ docker-compose up
. L'attachement correspondant d'un terminal peut être simple (considérons que leyml
a spécifié un service appelémyservice
):Cependant, si vous utilisez un
yml
nom de fichier différent , tel quedocker-compose-mycompose.yml
, il doit être lancé à l'aide de$ docker-compose -f docker-compose-mycompose.yml up
. Pour attacher un terminal interactif, vous devez également spécifier leyml
fichier, tout comme:la source