2016-04-25 13 views
1

Ich bin neu in Docker, habe also mit einem sehr grundlegenden Problem zu kämpfen.Schreiben von Dockerfile für Dockerhub Automatisierte Builds

Ich habe ein Maven-Projekt. In der lokalen Umgebung, alles, was ich tun um das Projekt auszuführen ist:

mvn clean package jetty:run 

ich jetzt versuchen, dies zu einem Github Repo verknüpft für automatisierte dockerhub Build zu verpacken. Hier sind die Schritte, die ich getroffen haben:

  1. ein Dockerfile Erstellt wie unten und hinzugefügt, um es an die Basisordner
  2. den Code Commit
  3. Erstellt auf GitHub und verknüpfen eine Autobuild-Repo in dockerhub zum Github Repo.
  4. notwendige Änderungen an den spezifischen Zweig und Dockerfile

Wenn ich eine Änderung begehen zeigen, kann ich sehen, es ein Build löst und die Build erfolgreich ist. Allerdings, wenn ich die Docker Bild laufen, kommt es zurück mit dem folgenden Fehler:

docker: Error response from daemon: Container command 'mvn clean package jetty:run' not found or does not exist.. 

Hier ist die Ordnerstruktur:

/Dockerfile 
/pom.xml 
/src/<folders that contain the code> 

Hier ist das, was ich in der Dockerfile haben:

FROM maven:3.3.9-jdk-8 
CMD ["mvn clean package jetty:run"] 

Ich denke, ich verpasse es, eine Kopie des Codes in den Container zu holen. Aber was ist der beste Weg, dies zu tun? Ich habe versucht, den COPY Befehl, aber ich konnte es nicht funktionieren.

Bitte helfen.

+0

Versuchen Sie, diese Dockerfile https://github.com/carlossg/docker-maven/blob/b022df671b603a9100ed9e75803ae32f753826a4/jdk-8/onbuild/Dockerfile, aber lösche den 'ONBUILD' Teil. –

Antwort

0

Die maven Dockerfile enthält bereits die Kopieranweisung, die aktiviert wird, wenn Sie Ihr Bild docker build (mit der ONBUILD directive).
Es basiert auf einem maven image, der mvn in /usr/bin setzt.

Sie sollen keine Maven Befehl tun, sondern vielmehr, wie described in the doc

FROM maven:3.2-jdk-7-onbuild 
CMD ["do-something-with-built-packages"] 

Put this file in the root of your project, next to the pom.xml .

This image includes multiple ONBUILD triggers which should be all you need to bootstrap. The build will COPY . /usr/src/app and RUN mvn install .

Das bedeutet, dass das resultierende Bild bereits die Quellen kopiert und mvn die Anwendung kompiliert wird, wegen der ONBUILD Richtlinie , was es zu einem schlechten Kandidaten für automatisierte Dockerhub-Builds macht.

+0

Ich bin etwas verwirrt, was Sie sagen. Meine Bedürfnisse sind, die Anwendung auszuführen. Was muss ich tun, damit es möglich ist? In der lokalen Umgebung verwende ich die verschiedenen mvn-Plugins, um einen sauberen Start zu erhalten. Wie kann ich es in Docker erreichen? Sollte ich oder sollte ich das ONBUILD-Bild nicht verwenden? Oder sollte ich ONBUILD eigene Auslöser schreiben? Ich weiß, das ist ein bisschen einfach, aber ich kämpfe trotzdem damit. – Ritwik

+0

@Ritwik Ich meine, die Anwendung ist bereits auf Docker Build kompiliert. Das macht das Basis-Image mit seiner ONBUILD-Direktive. Dein Bild sollte also als CMD einen Befehl haben, der die Anwendung ausführt, nicht kompiliert. – VonC

+0

vielleicht brauche ich hier eine kleine Handhaltung. Also habe ich die Dockerfile modifiziert und es sieht jetzt so aus: 'VON maven: 3.3-jdk-7-onbuild CMD [" mvn jetty: run "]' Wenn ich einen Dockerlauf mache, wirft es immer noch einen ähnlichen Fehler 'docker: Fehler Antwort vom Daemon: Container Befehl 'mvn jetty: run' nicht gefunden oder existiert nicht ..' – Ritwik

1

Das Problem hier ist, dass "MVN" ist der Befehl und "reinigen", "Paket" und "Anlegesteg: Lauf" sind seine Parameter. Shells wie Bash trennen sie automatisch. Docker tut es nicht.

CMD ["mvn clean package anle: run"] lässt docker nach einer Datei mit dem Namen "/ usr/bin/mvn clean package jetty: run" suchen, die natürlich nicht existiert.

Eine richtige Form ist:

CMD ["executable","param1","param2"] 

In Ihrem Fall:

CMD ["/usr/bin/mvn", "clean", "package", "jetty:run"] 
Verwandte Themen