Je souhaite démarrer un service avec docker-compose et faire en sorte que le conteneur fonctionne afin que je puisse obtenir son adresse IP via "docker inspect". Cependant, le conteneur quitte toujours juste après le démarrage.
J'ai essayé d'ajouter "commande: [" sleep "," 60 "]" et d'autres choses au fichier docker-compose.yml, mais chaque fois que j'ajoute la ligne avec "commande: ...", je ne peux pas appeler "docker-composer jusqu'à" j'obtiendrai le message "Impossible de démarrer le conteneur ..... Erreur système: le caractère 'k' non valide recherche le début de la valeur"
J'ai également essayé d'ajouter "CMD sleep 60" et ainsi de suite au fichier Docker, mais ces commandes ne semblent pas être exécutées.
Existe-t-il un moyen simple de garder le conteneur en vie ou de résoudre l'un de mes problèmes?
EDIT: Voici le fichier Compose que je veux exécuter:
version: '2'
services:
my-test:
image: ubuntu
command: bash -c "while true; do echo hello; sleep 2; done"
Cela fonctionne bien Si je commence avec docker-compose sous OS X, mais si j'essaie de la même manière sous Ubuntu 16.04, le message d'erreur ci-dessus s'affiche.
Si j'essaye l'approche avec le Dockerfile, le Dockerfile ressemble à ceci:
FROM ubuntu:latest
CMD ["sleep", "60"]
Ce qui ne semble rien faire
EDIT 2: Je dois me corriger, il s’est avéré que c’était le même problème avec le fichier Dockerfile et le fichier docker-compose.yml: chaque fois que j’ajoutais "CMD ..." au fichier Dockerfile OR = ajouter "commande ..." au fichier de composition, j'obtiens l'erreur ci-dessus avec le caractère non valide. Si je supprime les deux commandes, cela fonctionne parfaitement.
Pour garder un conteneur actif lorsque vous le démarrez avec docker-compose
, utilisez la commande suivante
command: tail -F anything
Donc, votre docker-compose.yml devient
version: '2'
services:
my-test:
image: ubuntu
command: tail -F anything
et vous pouvez exécuter un shell pour entrer dans le conteneur à l'aide de la commande suivante
docker exec -i -t composename_my-test_1 bash
où composename
est le nom que docker-compose
préfixe à vos conteneurs.
Basé sur le commentaire de @aanand sur GitHub le 26 août 2015 , on pourrait utiliser tail -f /dev/null
dans docker-compose pour que le conteneur reste actif.
exemple de docker-compose.yml
version: '3'
services:
some-app:
command: tail -f /dev/null
Pourquoi cette commande?
La seule raison pour laquelle cette option a été choisie est que GitHub a suscité beaucoup d'admiration, mais la réponse la plus votée ne signifie pas que c'est la meilleure réponse. La deuxième raison était pragmatique, car les problèmes devaient être résolus dès que possible en raison des délais.
docker-compose.yml
version: "3"
services:
ubuntu:
image: ubuntu:latest
tty: true
docker-compose up -d
du terminaldocker ps
pour obtenir l'ID ou le nom du conteneurdocker inspect $container_id
docker-compose exec ubuntu /bin/bash
ou docker-compose exec ubuntu /bin/sh
docker-compose down
Voici un petit script bash (my-docker-Shell.sh
) pour créer le fichier de composition du menu fixe, exécutez le conteneur, connectez-vous au conteneur, puis nettoyez enfin le conteneur du menu fixe et le fichier de composition du menu fixe lorsque vous vous déconnectez.
#!/bin/bash
cat << 'EOF' > ./docker-compose.yml
---
version: "3.7"
services:
ubuntu:
image: ubuntu:latest
command: /bin/bash
# tty: true
...
EOF
printf "Now entering the container...\n"
docker-compose run ubuntu bash
docker-compose down
rm -v ./docker-compose.yml
Vous pouvez utiliser l'option de configuration tty
.
version: '3'
services:
app:
image: node:8
tty: true
Dans le fichier Docker, vous pouvez utiliser la commande:
{CMD sleep infinity}
Comme l’a déclaré l’intervenant, il faudrait consulter le fichier Docker en question pour vous donner une réponse complète, mais c’est une erreur très courante. Je peux à peu près garantir que la commande que vous essayez d'exécuter lance un processus en arrière-plan. Cela pourrait être la commande que vous exécuteriez dans des situations autres que Docker, mais ce n'est pas la bonne chose à faire dans un fichier Docker. Par exemple, si ce que vous exécutez est généralement défini comme un service système, vous pouvez utiliser quelque chose comme "systemctl start". Cela commencerait le processus en arrière-plan, ce qui ne fonctionnerait pas. Vous devez exécuter le processus au premier plan pour que tout le processus soit bloqué.