Docker – Ausgabe-Befehl, von einem verknüpften container zu einem anderen

Ich versuche zum einrichten einer primitiven CI/CD-pipeline mit 2 Docker-Container-ich nenne Sie jenkins und Knoten-app. Mein Ziel ist es, für die jenkins container für die Ausführung eines Jobs auf, sich verpflichten, einen GitHub-repo (das ist fertig). Dieser job laufen soll, eine deploy.sh Skript auf dem Knoten-app container. Daher, wenn ein Entwickler auf GitHub, jenkins nimmt das Begehen, startet dann einen job mit automatisierten tests (in der Zukunft), gefolgt von einer Implementierung auf Knoten-app.

Den jenkins container ist mit der neuesten Bild (Dockerfile).

Den Knoten-app container Dockerfile ist:

FROM node:latest
EXPOSE 80
WORKDIR /usr/src/final-exercise
ADD . /usr/src/final-exercise

RUN apt-get update -y
RUN apt-get install -y nodejs npm
RUN cd /src/final-exercise; npm install

CMD ["node", "/usr/src/final-exercise/app.js"]

jenkins und Knoten-app sind verknüpft mit Docker Compose, und dass docker-compose.yml – Datei enthält (aktualisiert, danke an @Jens):

node-app:
  container_name: node-app
  build: .
  ports:
   - 80:80
  links:
   - jenkins
jenkins:
  container_name: jenkins
  image: jenkins
  ports:
   - 8080:8080
  volumes:
   - /home/ec2-user/final-exercise:/var/jenkins

Die Container sind gebaut mit docker-compose up -d und starten, wie erwartet. docker ps Erträge (aktualisiert):

CONTAINER ID        IMAGE                    COMMAND                  CREATED                 STATUS              PORTS                               NAMES
69e52b216d48        finalexercise_node-app   "node /usr/src/final-"   3 hours ago         Up 3 hours          0.0.0.0:80->80/tcp                  node-app
5f7e779e5fbd        jenkins                  "/bin/tini -- /usr/lo"   3 hours ago         Up 3 hours          0.0.0.0:8080->8080/tcp, 50000/tcp   jenkins

Kann ich ping jenkins von Knoten-app und Umgekehrt.

Ist das überhaupt möglich? Wenn nicht, bin ich eine architektonische Fehler hier?

Vielen Dank im Voraus, ich weiß es zu schätzen!

BEARBEITEN:
Ich stolperte nsenter und einfach die Eingabe einer container Schale mit diese und diese. Allerdings werden diese beiden davon ausgehen, dass der Ursprung (in Ihrem Fall dem host-Rechner, in meinem Fall die jenkins container) hat Docker installiert, um zu finden, die PID der Ziel-container. Ich kann nsenter in Knoten-app von dem host, aber noch kein Glück aus jenkins.

InformationsquelleAutor reedflinch | 2016-01-08



One Reply
  1. 0
    node-app:
      build: .
      ports:
       - 80:80
      links:
       - finalexercise_jenkins_1
    
    jenkins:
      image: jenkins
      ports:
       - 8080:8080
      volumes:
       - /home/ec2-user/final-exercise:/var/jenkins
    

    Versuchen, die oben genannten. Sie sind die Verknüpfung von Bild, Namen, aber Sie müssen verwenden Sie container Namen.
    In Ihrem Fall, da Sie nicht explizit angeben, der name des Containers, wird es automatisch generiert wird, wie diese

    finalexercise : folder where your docker-compose.yml is located
    node-app      : container configs tag
    1             : you only have one container with the prefix finalexercise_node-app. If you built a second one, then its name will be finalexercise_node-app_2
    

    Den Aufbau der yml-Dateien:

    node-app:
      build: .
      container_name: my-node-app
      ports:
       - 80:80
      links:
       - my-jenkins
    
    jenkins:
      image: jenkins
      container_name: my-jenkins
      ports:
       - 8080:8080
      volumes:
       - /home/ec2-user/final-exercise:/var/jenkins
    

    Natürlich können Sie einen container mit dem Namen für die Knoten-app als gut, so dass Sie verwenden können, etwas, das Konstante für die Kommunikation.

    Update

    Um zu testen, melden Sie zu einem bash-terminal des jenkins-container

    docker exec -it my-jenkins bash
    

    Dann versuchen Sie, ping meine-Knoten-app, oder auch telnet für den bestimmten port.

    ping my-node-app:80
    

    Oder Sie könnten

    telnet my-node-app 80
    

    Update

    Was Sie tun möchten, ist leicht erreicht, indem die exec Befehl.
    Ihr Gastgeber Sie diese ausführen kann (versuchen Sie es, so sind Sie sicher, dass es funktioniert)

    docker exec -i <container_name> ./deploy.sh
    

    Wenn das oben funktioniert, dann ist dein problem Delegierten der Ausführung des gleichen Befehls aus einem container. Als es ist die Sie nicht tun können, da der container, der den Befehl (jenkins) keinen Zugriff auf Ihre host docker-installation (die erkennt nicht nur den Befehl, sondern hält die Kontrolle der container, die Sie benötigen Zugriff auf).

    Habe ich nicht verwendet, entweder von Ihnen, aber ich kenne zwei Lösungen

    1. Verwenden Sie diese offizielle guide, um Zugriff auf Ihren host docker-daemon und die Ausgabe von docker-Befehle von Ihrem Behälter, als wenn Sie es Taten, von Ihrem Gastgeber.
    2. Montieren Sie die docker-binary und sockel in den container, also der container wirkt, als ob es der host (jeder Befehl wird ausgeführt, indem der docker-daemon von Ihrem Gastgeber, da ist es freigegeben).

    Diese thread aus, SO gibt uns weitere Einsicht zu diesem Problem.

    • Das ist extrem hilfreich, so weit wie die Organisation meiner Container-danke. Aber ich bin immer noch am kämpfen mit, herauszufinden, wie zu initiieren Befehle für meine Knoten-app-container von my jenkins-container. Zum Beispiel, jenkins erzählt Knoten-app, die es braucht, um laufen deploy.sh.
    • Gilt das gleiche. Geben Sie einen Namen für Ihren Knoten-app-container und verwenden Sie diese als hostname, während in jenkins, die Kommunikation mit der Knoten-app. Ich aktualisiert meine Antwort, um es ein wenig klarer
    • Wissen das zu schätzen. Ich habe in der Lage, die ping-Knoten-app-container die ganze Zeit, jedoch. Was ich nicht herausfinden kann, ist wie nennen die deploy.sh Skript von jenkins.
    • Ich aktualisiert meine Antwort. Bitte vergessen Sie nicht, akzeptieren Sie die Antwort, wenn es dein problem gelöst hat.
    • Habe ich eine sehr hilfreich link in Ergänzung zu Jens‘ Antwort. Meine endgültige Lösung beteiligt, was der Autor fordert Docker-außerhalb-von-Docker (DooD), wobei die jenkins – container tatsächlich läuft docker exec -i node-app bash und dann übergehend in das deploy-Befehl der – Knoten-app – container. Bitte beachten Sie, dass die -t-flag in docker exec -it node-app bash in Jens‘ Antwort wird nicht funktionieren, da bekommst du einen tty-Fehler.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.