Ich suche nach einer Möglichkeit, Docker-fähiges Build auszuführen, das aus mehreren Containern in Jenkins 2.0 besteht.
Gibt es Pläne für die systemeigene Unterstützung von Docker Compose in Pipeline oder über CloudBees Docker-Plugins für Pipeline?.
Oder kann/muss dies durch explizite Aufrufe sh docker-compose...
angesprochen werden? Verwenden Sie sie möglicherweise sogar in try... finally
, um den Lebenszyklus von Services weiter zu steuern.
BEARBEITEN: Die erste Antwort war, eine Möglichkeit vorzuschlagen, Docker-Container in Jenkins zu erstellen. Das ist hier nicht nötig. Ich (EngineerDollery) möchte meine Zielplattform in jenkins mit compose aufrufen, damit ich meine App dafür bereitstellen und End-to-End-Tests ausführen kann.
Nach der Suche in Jenkins Bug Tracking , JENKINS-35025 schlägt vor, dass docker-compose.yml
beim Ausführen eines Jobs in einem Docker-Container mit einem maven build berücksichtigt wird.
Siehe auch CI-Pipeline mit Jenkins erstellen , die davon ausgeht, dass Docker-Compose auf Ihrem Jenkins-Server installiert ist.
Hinweis: ein Jahr später (August 2017) wird Docker-Compose im Docker Pipeline-Plugin noch nicht unterstützt
Juli 2018, Ivan Aracki Anmerkungen in den Kommentaren :
Die manuelle Installation von
docker-cli
unddocker-compose
mit derselben Version wie Hosts ist die Lösung für jetzt ...
Hier sind die Dateien zum Ausführen eines Jenkins-Containers, in dem das Andockfenster ausgeführt wird:
docker run \
-p 8080:8080 \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins \
getintodevops/jenkins-withdocker:lts
referenz: https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci
Ich stehe vor einem ähnlichen Problem. Ich habe diese https://reinout.vanrees.org/weblog/2017/10/03/docker-compose-in-jenkins.html gefunden - aber ich weiß nicht, was damit zusammenhängt .
Mein Problem ist der Test während der Entwicklung, und auch der Test wird in Jenkins automatisiert, und ich benutze Docker-Compose, um einige PHP-Skripte UND einen MySQL-Server aufzurufen, um isolierte Tests (ab sofort phpunit) auszuführen.
Ich könnte denken, dass ich das erreichen kann
docker network create
)docker run mysql --network=netname --name=mysqlmachine
mysqlmachine
als Host verwiesen wird.Dies würde jedoch bedeuten, dass ich Db-Daten einrichten, Db-Daten bereinigen und auch immer auf der mysqlmachine belassen muss, auch wenn sie nicht benötigt wird, und einige RAM-Ressourcen verbraucht. Das letzte Problem kann ich mit dem Befehl docker start mysqlmachine
und docker stop mysqlmachine
in meiner Jenkinsfile lösen, die die Pipeline definiert.
Aber auch beim Ausführen einer Shell in das Andockfenster, wo jenkins ausgeführt wird, kann ich den Befehl docker
nicht finden
Für mich ist eine praktikable Lösung, bis ich nichts Besseres finden kann
UPDATE: Ich werde die https://wiki.jenkins.io/display/JENKINS/Docker+Slaves+Plugin -Lösung ausprobieren, sie hat fast das, was ich brauche
UPDATE 08.02: .__, wie von Alexander Zeitler vorgeschlagen, mit
agent {
docker {
image 'pdmlab/jenkins-node-docker-agent:6.11.1'
args '-v /var/run/docker.sock:/var/run/docker.sock'
}
}
in Jenkins-Datei können Sie den Befehl docker-compose verwenden: Docker in einem Docker, dh Docker in Docker in der Nähe eines Dockers, wie hier beschrieben: Docker in Docker - Volumes funktionieren nicht: Volle Dateien im 1st-Level-Container, leer in 2nd Tier
Ich habe es jedoch vorgezogen, einen anderen Ansatz zu verwenden, bei dem Jenkins nicht auf besondere Weise ausgeführt werden müssen.
Die Pipeline sagt:
stage('Test') {
steps {
sh './build_docker.sh jenkinstests'
}
}
und build_docker.sh macht:
jenkinstests)
docker volume create idealodbconn
docker run -v idealodbconn:/data --name helper busybox true
docker cp ./dbconn/db249.json helper:/data
docker rm helper
docker-compose -f services/docker-compose-jenkins.yml up \
--abort-on-container-exit \
--exit-code-from idealoifapi
docker-compose -f services/docker-compose-jenkins.yml rm -f
docker volume rm idealodbconn
;;
Auch hier heißt --abort-on-container-exit
zum Beenden, sobald ein in docker-compose-jenkins.yml definierter Container beendet ist und --exit-code-from idealoifapi
sagt, dass der Exit-Code dem idealoifapi-Image entnommen werden soll.
Das ist alles. Fehlender Teil ist vielleicht die Verwendung des Volumes durch docker-compose-jenkins.yml, es ist extern: true:
volumes:
idealodbconn:
external: true