staging.inyokaproject.org

Suche Hilfe von Erfahrenen - Dockerfile und Shell-Scripte splitten

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

MasterPetz

Anmeldungsdatum:
19. Juni 2016

Beiträge: Zähle...

Da ich an anderer Stelle (außerhalb des Forums) keine Hilfe fand, hoffe ich, dass ich hier Hilfe von erfahrenen Personen bekommen kann.

Da ich leider nicht alle Linux-Befehle verstehe, erhoffe ich mir auch hier Aufklärung was diese genau machen und ob ich diese in den einzelnen Shell-Scripten (.sh) oder gar im gesplitteten Dockerfile benötige oder nicht. Wahrscheinlich muss man das Dockerfile selber garnicht splitten sondern nur für meine Zwecke (und jeder Instanz abwandeln) - da scheint mir wenig drin zu sein.

Mir geht es darum, dass ich ein Dockerfile bzw. die Shell-Scripte so aufsplitten kann, dass ich jeder Anwendung ihren eigenen Container/Image geben kann. Ich benötige von der Hauptapplikation 2 laufende Instanzen, aber z.B. nur eine Datenbank (MariaDB), 1x Postfix, 1 Nginx etc.

Dockerfile: https://github.com/zammad/zammad-docker/blob/master/Dockerfile

Docker-Entrypoint.sh: https://github.com/zammad/zammad-docker/blob/master/docker-entrypoint.sh

Install-script.sh: https://github.com/zammad/zammad-docker/blob/master/install-zammad.sh

Meine Fragen zum Dockerfile: Was genau macht der Befehl? # set shell SHELL ["/bin/bash", "-e", "-o", "pipefail", "-c"]

Eine Shell setzen, laut dem Kommentar "#"... und pipefail würde eine Meldung ausgeben, wenn ein Fehler auftritt. Soweit richtig?

Wenn ich das Dockerfile für jede Instanz nutzen möchte, dann muss ich Sachen wie die ENV's und das LABEL anpassen?

Meine Fragen zum Install-Script: Möchte darin kein "apt-get update" etc. haben, da ich multi-stage builds verwenden möchte und somit diese Befehle nur im FROM Image benutzt werden sollen (wenn irgendwie möglich). Wie ich sehe installiert er aber ja Sachen nach: "# install dependencies apt-get --no-install-recommends -y install apt-transport-https ca-certificates-java curl libimlib2 libimlib2-dev libterm-readline-perl-perl locales memcached net-tools nginx default-jdk shared-mime-info nodejs"

Kann ich davon auch etwas "auslagern", sprich als eigenständigen Container laufen lassen? Den Nginx kann ich ja als eigenständigen Container laufen lassen.

Wie ihr seht tue ich mir damit schon schwer, so dass ich hier auch nicht jeden Befehl aus den einzelnen Dateien aufführen und was dazu fragen möchte.

Edit: Titel angepasst, da schon über 30 mal gelesen...

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

MasterPetz schrieb:

Da ich leider nicht alle Linux-Befehle verstehe, erhoffe ich mir auch hier Aufklärung was diese genau machen und ob ich diese in den einzelnen Shell-Scripten (.sh) oder gar im gesplitteten Dockerfile benötige oder nicht.

Da hilft es die Manpages bzw. Dokumentation zu den Befehlen zu sichten - das ist immer eine schlechte Idee Dinge zu übernehmen, die man nicht verstanden hat.

Was genau macht der Befehl?

# set shell
SHELL ["/bin/bash", "-e", "-o", "pipefail", "-c"]

Eine Shell setzen, laut dem Kommentar "#"... und pipefail würde eine Meldung ausgeben, wenn ein Fehler auftritt. Soweit richtig?

Ja, das setzt wie in https://docs.docker.com/engine/reference/builder/#shell beschrieben die Shell und die Argumente, mit denen sie aufgerufen wird. Was die einzelnen Argumente bewirken, kannst du in https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Modifying-Shell-Behavior nachlesen.

Meine Fragen zum Install-Script: Möchte darin kein "apt-get update" etc. haben, da ich multi-stage builds verwenden möchte und somit diese Befehle nur im FROM Image benutzt werden sollen (wenn irgendwie möglich).

Das apt-get update sollte unmittelbar vor dem apt-get install erfolgen, weil sich der Inhalt der Paketquellen sich jederzeit (z.B. für Sicherheitsupdates) ändern kann. Wenn du einen mehrzeitigen Build machst, kann die Installation von Paketen fehlschlagen, die noch im Cache referenziert werden, aber mittlerweile nicht mehr in der Version auf den Servern vorhanden sind. Im Idealfall hast du ein Dockerfile, das einen Dienst definiert und verbindest dann die Docker-Container miteinander.

Kann ich davon auch etwas "auslagern", sprich als eigenständigen Container laufen lassen?

Ein eigenes Dockerfile pro Dienst und dann ein ein Tool wie Docker Compose, um die Container zu orchestrieren.

MasterPetz

(Themenstarter)

Anmeldungsdatum:
19. Juni 2016

Beiträge: 19

Danke! Das hilft mir jetzt nur am Rande... Hatte die Hoffnung man hilft mir um aus allem einzelne Images je App zu machen. Oder nehme ich mir jetzt einfach z.B. ein Debian Image installiere darin die App und lade mir zzgl. jede andere Anwendung (DB, postfix...) aus dem Hub? Dann habe ich sicherlich wieder was vergessen (Befehle oder Dateien; welche in den 3 obigen Dateien ausgeführt oder kopiert werden) damit alles reibungslos läuft.

Docker Compose möchte ich nicht verwenden, da ich ggf. doch die ein oder andere Instanz der Haupt-App mehr brauche. Da dann alles zu stoppen und wieder zu starten... zu umstämdlich. Da starte ich die zusätzliche Instanz dann lieber per run -d und weiteren Optionen.

BillMaier Team-Icon

Supporter

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6389

Hallo!

MasterPetz schrieb:

Da ich an anderer Stelle (außerhalb des Forums) keine Hilfe fand, hoffe ich, dass ich hier Hilfe von erfahrenen Personen bekommen kann.

Hier gibt es Hilfe zur Selbsthilfe. Wenn du erwartest, dass hier andere die Arbeit machen, also dir Zeile für Zeile die Lösung schreiben, dann wirst du hier sicher enttäuscht werden. MasterPetz schrieb:

Hatte die Hoffnung man hilft mir um aus allem einzelne Images je App zu machen.

Wie gesagt, das kommt darauf an, was du unter "Hilfe" verstehst.

Oder nehme ich mir jetzt einfach z.B. ein Debian Image installiere darin die App und lade mir zzgl. jede andere Anwendung (DB, postfix...) aus dem Hub?

So würde ich das wohl machen. Im besten Fall hast du einen Container per (Micro)Service. Geht aber auch anders. s.u.

Docker Compose möchte ich nicht verwenden, da ich ggf. doch die ein oder andere Instanz der Haupt-App mehr brauche. Da dann alles zu stoppen und wieder zu starten... zu umstämdlich.

Dann hast du vermutlich Docker Compose falsch verstanden. Denn das macht beim docker-compose up genau das: Nur ändern, was zu ändern ist, der Rest bleibt.

Mir geht es darum, dass ich ein Dockerfile bzw. die Shell-Scripte so aufsplitten kann, dass ich jeder Anwendung ihren eigenen Container/Image geben kann.

Der bessere Weg ist wohl tatsächlich, Dockerfiles bzw. Images zu finden, die das machen, was du brauchst. Natürlich kannst du auch einen überfüllten Container in kleinere versuchen zu zerlegen, aber da wirst du vermutlich nicht glücklich.

Ich benötige von der Hauptapplikation 2 laufende Instanzen, aber z.B. nur eine Datenbank (MariaDB), 1x Postfix, 1 Nginx etc.

Dockerfile: https://github.com/zammad/zammad-docker/blob/master/Dockerfile

Docker-Entrypoint.sh: https://github.com/zammad/zammad-docker/blob/master/docker-entrypoint.sh

Install-script.sh: https://github.com/zammad/zammad-docker/blob/master/install-zammad.sh

Gut, dass du die Links postest, dann kann ich konkret Feedback geben:

Ich bin zwar kein Freund von solch großen Bundles innerhalb eines Dockerfiles, aber wenn es die Hersteller der Software so anbieten, würde ich es einfach nehmen und so benutzen. Was erhoffst du dir von einer Skalierung des Web-Containers, während du die anderen jeweils nur 1x hast?

Wenn dir das so wichtig ist, könntest du im ersten Schritt einfach den https://github.com/zammad/zammad-docker/blob/master/docker-entrypoint.sh per Image anpassen - indem du einfach nur die Services startest, die du im jeweiligen Image brauchst.

Die größere Baustelle wird wohl aber sein, die Applikation dazu zu bringen, dass sie mit den anderen Containern zusammenarbeitet, also diese findet: Wo liegt die Datenbank, der Postfix etc. Das muss konfiguriert werden, sonst funktioniert das nicht.

Ich benötige von der Hauptapplikation 2 laufende Instanzen, aber z.B. nur eine Datenbank (MariaDB), 1x Postfix, 1 Nginx etc.

Wenn du nur 1x Nginx willst, wie sollen dann die Web-Daten in der "Hauptapplikation" (die du zwei Mal haben willst) angezeigt werden?

Viele Grüße

BillMaier

/edit: Antwort präzisiert

MasterPetz

(Themenstarter)

Anmeldungsdatum:
19. Juni 2016

Beiträge: 19

BillMaier schrieb:

Was erhoffst du dir von einer Skalierung des Web-Containers, während du die anderen jeweils nur 1x hast?

Mehrere Firmen haben ihr eigenes Ticket-System?! Oder hab ich die Frage falsch verstanden?

BillMaier schrieb:

Wenn du nur 1x Nginx willst, wie sollen dann die Web-Daten in der "Hauptapplikation" (die du zwei Mal haben willst) angezeigt werden?

Das ist doch eine Einstellungssache von Nginx (z.b. Reverse Proxy oder Virtual Hosts). Die eine Seite wird z.B. per Port 8080 aufgerufen, die andere z.B. per 8081... ginge auch per Subdomains. Nagel mich darauf jetzt nicht fest.

PS: Wir schweifen jetzt leider total vom eigentlichen Thema ab.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

BillMaier schrieb:

Ich bin zwar kein Freund von solch großen Bundles innerhalb eines Dockerfiles, aber wenn es die Hersteller der Software so anbieten, würde ich es einfach nehmen und so benutzen.

Das ist laut der README auch der falsche Weg für den Produktiven Betrieb - ich zitiere mal aus der README.md:

This repos is meant to be the starting point for somebody who likes to test Zammad. Be aware that all data is lost, if the container is stopped.

If you like to run zammad in production you should use one of the DEB or RPM packages or try our docker-compose repo: https://github.com/zammad/zammad-docker-compose

Da ist das schön aufgedröselt, jeder Container hat sein eigenes Dockerfile und docker-compose kümmert sich darum die Dinger in der richtigen Reihenfolge zu starten - da müsste man nur noch Anpassungen für zusätzliche Instanzen vornehmen.

MasterPetz

(Themenstarter)

Anmeldungsdatum:
19. Juni 2016

Beiträge: 19

@seahawk1986 Mir ist bewusst das es keine persitenten Daten sind! 😉 Daher ja auch mein Vorhaben für alles eigene Images zu erstellen. Das hat zwar damit nichts zu tun, aber dann ist es ja nur eine Frage wie man den/die Container startet (um persistente Daten zu haben)! Und nein, ich frage hier nicht wie ich persistente Daten erhalte!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

Die Arbeit hat der Entwickler bereits geleistet, die dafür nötigen Dateien stecken in den jeweiligen Unterverzeichnissen von zammad/zammad-docker-compose/tree/master/containers. Ob man die dann mit docker-compose oder zu Fuß verwaltet, ist relativ egal, aber wahrscheinlich wesentlich mehr Arbeit, wenn man selber Änderungen hinterherlaufen muss.

BillMaier Team-Icon

Supporter

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6389

seahawk1986 genau so gehört das 👍

MasterPetz

(Themenstarter)

Anmeldungsdatum:
19. Juni 2016

Beiträge: 19

Gut, laut der compose.yml werden einzelne Images verwendet... müsste ich jetzt aber logischerweise nicht nur in der compose-Datei sondern auch in den Shell-Scripten anpassen (z.B. für MariaDB, statt PostgreSQL).

Dafür müsste ich natürlich widerum wissen was ich wie anpassen muss...

Beispiel(e):

sed -e 's#.*adapter: postgresql#

# configure database

sed -e "s#.*adapter:.*# adapter: postgresql#g"

Sehe schon, einen haufen Arbeit. 🙄

BillMaier Team-Icon

Supporter

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6389

MasterPetz schrieb:

(z.B. für MariaDB, statt PostgreSQL).

Warum tust du dir das an und verwendest nicht das was es schon von den Entwicklern offizielles gibt?

MasterPetz

(Themenstarter)

Anmeldungsdatum:
19. Juni 2016

Beiträge: 19

Weil ich die Datenbank auch anderweitig nutzen möchte. Weil keine 2 untersch. Datenbank-Systeme eingesetzt werden sollen. Weil ich mich mit PostgreSQL nicht auskenne. Weil PostgreSQL nicht gewünscht wird. ...

BillMaier Team-Icon

Supporter

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6389

Hallo,

Hilfe gefunden und Thema gelöst? Dann bitte als solches markieren. Danke.

Gruß BillMaier

Antworten |