Art von neuen mit Docker in der Produktion habe ich eine Design-Frage. Was ist der beste Ansatz, um mit Docker eine PHP-App zu implementieren, die Daten und Informationen enthält, die von anderen Containern im Hauptanwendungsverzeichnis verwendet werden, die über die Builds aktualisiert werden müssen?Docker Bereitstellung Update freigegebenes Volumen
Beispiel (Symfony Art von App vereinfachen):
- application
- app
- src
- vendor
- conf
- conf/vhost.conf
- web/assets/*
Und lassen Sie uns mit nur zwei Dienste vereinfachen
- php-fpm
- nginx
1/Der erste Versuch war 2 Bilder
- zu bauen php-fpm: mit
HINZUFÜGEN./Var/www/html/Projekt/
VOLUME/var/www/html/Projekt/
Anbieter (Komponist) in der Dockerfile
auf diese Weise installiert ich erreichen konnte/var/www/html/Projekt/auf nginx
volumes_from php-fpm
=> und dann ist die Konfiguration und die Anlagen usw.
Aber wenn ich nicht falsch bin, ist das nicht der gute Weg, es zu tun, weil mein Bild im nächsten Build das VOLUME/var/www/html/project/nicht aktualisiert (weil es a Volumen) => dann wird mein Code nie aktualisiert werden.
2/Dann landete ich, dass da oben:
- providing the last code base in the image: COPY . /data/image/app
- creating a named volume: docroot
- mount docroot on php-fpm
- adding a rsync on the entrypoint to sync /data/image/app to docroot:/var/www/html/project (with the good excludes that I needed)
- doing the vendors(composer) install in the entrypoint
=> noch mit volumes_from: php-fpm auf nginx.
was wichtig ist, weil ich will:
- the conf/vhost.conf
- the assets
- maybe other stuff
Ich brauche kann eine Solr hinzufügen, dass einige Konfigurationsdateien verwenden und/oder Ressourcen usw.
3/Ich nehme ein anderer Ansatz besteht, dass würde bestehen, ADD spezifisch hinzuzufügen, was ich auf jedem Bild brauche.
Ich denke, es fügt Komplexität zum Build-Prozess hinzu, aber es macht auch eine Menge Sinn.
Also, was denkst du, habe ich etwas verpasst? Ansatz 2/oder 3 /, 4?
Vielen Dank!
Thx! Ihre Analogie zur DMZ ist interessant. Ich stimme dir zu. # 3 wurde mit 2 Bildern geplant. Ich möchte in der Lage sein, php-fpm und nicht nginx zu skalieren. Ich sehe 2 Dinge, die immer noch nicht ganz klar sind, um die Entscheidung zu treffen. - Gibt es irgendwelche offensichtlichen Fallstricke bei der Verwendung des Rsync-Wegs (mit mehreren Containern, die zur selben Zeit oder mit einem globalen Volume (Swarm) oder etwas anderem beginnen? - was ist mit mehr als statischen Dateien? Sagen wir, ich habe mehrere Dienste und jeder von ihnen benötigt einen Teil der Codebasis Ich denke, # 3 ist der sauberste Pfad, aber würde # 2 ein gültiger pragmatischer Ansatz in der Docker-Welt sein? – Plopix
So weit laufen mehrere Kopien von rsync, ich nicht Glauben Sie, dass dies zu Problemen führen kann Wenn Sie sich Sorgen machen, dass mehrere Kopien von rsync ausgeführt werden, können Sie eine einfache Lockfile-Logik wie hier beschrieben implementieren: http://stackoverflow.com/questions/9390134/rsync-cronjob-that-will-only -run-if-rsync-isnt-already-running Es gibt kein Konzept eines globalen Volumes bei der Verwendung von Schwarm-- Sie können jedoch ein Volume von einigen so gesichert werden rt des Netzwerk-Dateisystems. Sehen Sie das NFS-Beispiel hier: https://docs.docker.com/engine/reference/commandline/volume_create/ – programmerq
Ich mag den # 2-Ansatz überhaupt nicht, weil Ihr Code nicht länger ein Teil Ihres Docker-Images ist. Ihr Bild sollte in sich abgeschlossen sein. Es sollte das Build-Artefakt für Ihr Projekt sein. Wenn Sie den Code aus dem Bild entfernen, verteilen Sie kein eigenständiges Bild mehr. – programmerq