Comment faire pour exécuter un script shell en utilisant dockerfiles CMD
Je suis en utilisant dockerfiles construire un simple conteneur. Voici la Dockerfile
:
FROM XXXXXXX:5003/base-java
MAINTAINER XXXXX
ADD pubsub//opt/pubsub/
CMD ["/opt/pubsub/run.sh"]
Contenu de run.sh
est comme suit:
#!/bin/bash
nohup java -jar /opt/pubsub/publish.jar &
nohup java -jar /opt/pubsub/subscribe.jar &
C'est la simple application java pour pub/sub
.
Maintenant j'ai un autre conteneur de course rabbitmq et je suis reliant les 2 containers toutefois, chacune de ma tentative a juste manqué et Mon pub/sub
conteneur ne démarre pas. Quelqu'un peut-conseils sur la façon d'aller sur la debuggin ce problème? En quelque sorte menu fixe les journaux n'ont pas de quoi.
Ici est de savoir comment je suis reliant le contenant: sudo docker run -d -P --name pub_sub --link rabbitmq:rabbitmq1 image_pub_sub
Et voici comment je suis en utilisant le nom de l'alias dans mon pub/sub
code
factory = new ConnectionFactory();
factory.setHost("rabbitmq1");
try { connection = factory.newConnection();
channel = connection.createChannel();
channel.queueDeclare("pub", true, false, false, null);
}
catch (IOException e) { //TODO Auto-generated catch block
e.printStackTrace(); }
Je m'attendais à ce que mon publier code va créer une file d'attente dans le rabbitmq conteneur et de commencer à pousser des messages. Mon abonné code va se connecter à la même rabbitmq et de commencer à lire les messages.
Lorsque je lance la commande rien ne se passe, il imprime juste une longue id du nouveau conteneur et les sorties..Quand je lance sudo docker ps -a
, je peux voir les suivants:
e8a50d5aefa5 image_pub_sub:latest "/opt/pubsub/run.sh" 32 minutes ago Exited (0) 32 minutes ago pub_sub
Cela signifie donc mon conteneur n'est pas en cours d'exécution.
Seulement maintenant que j'ai testé en mettant à jour le /etc/hosts
par le lancement d'un nouveau conteneur à l'aide de la commande suivante: sudo docker run -i -t image_pub_sub /bin/bash
. Modifié la /etc/hosts
de ce conteneur et a ajouté l'entrée suivante <IP_ADDRESS> rabbitmq1
et a couru mon script /opt/pubsub/run.sh
et il ajoute le fichier nohup avec les messages suivants:
Message Sent
[x] Received 'Hello'
Message Sent
Message Sent
[x] Received 'Hello'
Veuillez ajouter à la question, plutôt que comme un commentaire. Et laissez-nous savoir ce qui ne se produit lorsque vous exécutez les commandes (le conteneur toujours en cours d'exécution? Comment savez-vous qu'il ne fonctionne pas?). Aussi, obtenir un shell dans le conteneur et le test de la connexion à la rabbitmq conteneur.
Merci. Pour le moment, il n'est pas clair si vous avez un problème de réseau ou de code/rabbitmq problème. Qu'advient-il si vous exécutez
docker exec -it pub_sub ping rabbitmq1
?Ajout de toutes les informations que vous avez demandé, s'il vous plaît laissez-moi savoir quoi faire pour clouer cette question.
OriginalL'auteur ashishjain | 2015-02-19
Vous devez vous connecter pour publier un commentaire.
Un conteneur Docker va s'arrêter quand ses principaux processus se termine. Dans votre cas, cela signifie que les deux applications Java sera fourche à l'arrière-plan (en raison de la
nohup
appel), le script sera immédiatement complète et le bac de sortie.Il y a quelques solutions:
nohup
appel de la deuxième java appel. De cette façon, le script ne pas quitter jusqu'à ce que la deuxième application Java sorties.2) Pas encore essayé mais ici, c'est ma compréhension, veuillez préciser si cela est correct. Utiliser le superviseur.conf et ajouter à la fois la java des processus. Maintenant il suffit de commencer supervisord processus en utilisant le dockerfile CMD ["/usr/bin/supervisord"]. Puisque c'est un processus sans fin qu'est ce que je suppose. 3) Ajout de fichiers jar dans 2 récipients wouldnt besoin pour construire 2 contenants séparés. Chacun de mes personnalisé construire des conteneurs avec java c'est la prise de 730 MO d'espace. Je voulais juste savoir pourquoi vous considérez cela comme la meilleure option.
2) Oui, je pense que c'est à peu près 3) Si vous utilisez la même image de base pour les deux récipients, alors il ne sera pas tout espace supplémentaire. C'est plus idiomatique pour avoir 1 processus par conteneur & il semble bien cadrer avec votre code.
Adrian - de toute façon je ne comprends pas pourquoi l'espace supplémentaire ne sera pas utilisé. Ici, c'est pourquoi je pense que l'espace serait doublé. - Je construire un conteneur-1 avec de la publication de code et de construire conteneur-2 avec abonnez-vous code. Conteneur 1 et 2 sont en utilisant la même base de l'image. Maintenant, je déployer conteneur 1 et 2 sur mon ordinateur hôte. U voir il y a 2 récipients différents. Ces deux fois l'espace n'est pas??
Pas de. Même image, même les fichiers. Deux machines virtuelles, ce qui peut être ou ne pas être un problème.
OriginalL'auteur Adrian Mouat
pouvez utiliser tail-f /dev/null ou de la queue de votre journal
OriginalL'auteur xiaochao