web-dev-qa-db-fra.com

Docker Compose maintient le conteneur en marche

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.

35
dingoglotz

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

composename est le nom que docker-compose préfixe à vos conteneurs.

55
Nick Settje

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.

34
030
  • Créez un fichier nommé docker-compose.yml
  • Ajouter ce qui suit au fichier
version: "3"

services:
  ubuntu:
    image: ubuntu:latest
    tty: true
  • Rester dans le même répertoire, lancez docker-compose up -d du terminal
  • Courir docker ps pour obtenir l'ID ou le nom du conteneur
  • Tu peux courir docker inspect $container_id
  • Vous pouvez entrer le conteneur et obtenir un shell bash exécutant docker-compose exec ubuntu /bin/bash ou docker-compose exec ubuntu /bin/sh
  • Lorsque vous avez terminé, assurez-vous que vous êtes en dehors du conteneur et exécutez 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
7
GMaster

Vous pouvez utiliser l'option de configuration tty.

version: '3'

services:
  app:
    image: node:8
    tty: true

6
highjump

Dans le fichier Docker, vous pouvez utiliser la commande:

{CMD sleep infinity}
3
John

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

2
David M. Karr