2017-04-24 4 views
2

Ich kann potenziell eine Docker-Datei, die wie folgt aussieht:sollte ich Komponist laufen in meinem Docker installieren bauen

COPY . ./ 
RUN composer install --no-dev --no-interaction -o 

aber ich habe privat repos in meinem composer.json und dies erfordert mich in der ssh kopieren Schlüssel für den Docker bauen, um ordnungsgemäß zu funktionieren. Ich fühle mich unwohl, meine ssh-Schlüssel in meinem php-Anwendung-Docker-Bild zu packen.

Alternativ kann ich Composer-Installation außerhalb des Docker-Build (in einem batch-Skript build.sh zum Beispiel) ausführen und das Verzeichnis KOPIEREN, nachdem der Hersteller/wurde ausgefüllt. Ist das ein richtiger Ansatz?

Gibt es andere Möglichkeiten, um mit diesem Problem umzugehen?

Antwort

5

Dies ist eine wirklich gute Frage, die ein Prinzip beschreibt, dass ich ein paar Mal jetzt konfrontiert habe, eigentlich zwei separate, aber verwandt Fragen:

1.) Wie man am besten in Docker

Docker ist groß bei enca Mit Transient Dateien umgehen pilling die totale und völlige Erholung einer Umgebung. Wenn Sie einen Teil des Prozesses 'außerhalb' des Containers ausführen, d. H. Sie composer install außerhalb des docker build Prozesses ausführen, dann haben Sie einen weniger portablen Build-Prozess, weil Sie Maschinen-/Umgebungsabhängigkeiten eingeführt haben, denen Sie nicht bewusst sind.

Wenn Sie immer die vollständige Umgebung in Docker neu erstellen, dann garantieren Sie, dass Ihre Abhängigkeiten immer erfüllt sind und Sie die Dockerdatei jedem anderen geben können und sie auch ein hohes Vertrauen darin haben, ohne Probleme lokal zu rekonstruieren.

Transient Dateien sind ideal für den Aufbau in Docker! Also würde ich versuchen, sie möglichst im Container zu bauen.

2.) Wie entkoppeln Genehmigung von Docker bauen Prozess

Was uns zur zweiten Ausgabe führt auf, wie Zulassung entkoppeln von Build?

Option 1 - Bake In Komponist auth.JSON mit Krediten für einen dedizierten Build-Benutzer:

Wie andere Antworten haben gesagt, Sie könnten die Anmeldeinformationen "einbacken" und dann wieder entfernen. Allerdings möchten Sie nicht etwas so Sensitives wie Ihre SSH-Schlüssel "einbrennen". Composer unterstützt eine auth.json Datei, also warum nicht einen dedizierten Build-Benutzer erstellen und seine Creds (statt Ihrer) in der Datei auth.json speichern? Wenn es jemals kompromittiert wurde, können Sie das Passwort ändern. Sobald die Composer-Installation abgeschlossen ist, entfernen oder überschreiben Sie die Datei.

COPY . ./ 
RUN composer install --no-dev --no-interaction -o 
RUN rm -f ./auth.json 

Option 2 - Nehmen Sie die creds sich vorübergehend und sie in den exec Docker Behälter mit Docker passieren:

Ich habe völlig diesen Ansatz nicht getestet, aber ich kann nicht sehen, warum etwas so würde das nicht funktionieren.

1.) Sie bauen eine Basis PHP Container, die lauffähig ist ‚Komponist installieren‘ (oder eine Verwendung von Docker Hub)

2.) Sie spinnen bis diese Behälterboden, so dass es läuft

3.) Sie verwenden docker exec, um Ihre Credits an ein Wrapper-Skript zu übergeben, das bereits in Ihrem Container gespeichert ist. Die Wrapper-Skripte ausgeführt werden soll Komponist installieren HTTP Basic-Authentifizierung verwenden - es wird bereits der Benutzername gebacken haben in so dass Sie nur das Passwort gemäß dem http-basic technique

docker exec -d my_base_php_container php -f /my_wrapper_script.php ${PASSWORD} 

4. zur Verfügung stellen müssen) Sie verpflichten sich diese Behälter als ein neues Bild

docker commit --change "composer install" ${CONTAINER_ID} my_installed_image:1.0 
+0

Also ist Ihr Hauptargument für das Bauen im Inneren alle Abhängigkeiten, die ich im Bild brauche? Warum nicht ein privates Bild zum Bauen haben, das das erstellte Artefakt kopiert? Auf diese Weise - ich habe einen konsistenten Build-Prozess mit allem, und keine gebackenen in Krediten oder SSH-Schlüssel, und auch mein eingesetztes Bild hat keine unnötigen Schichten wie Komponist im Inneren. – NiRR

+0

Ja genau, alle Abhängigkeiten innerhalb des Bildes geben Ihnen Konsistenz und Portabilität. Warum nicht unsere Docker-Container die Artefakte erstellen? Gute Frage und das ist ein weiterer guter Ansatz! Dies ist etwas, das ich zuvor mit einem Maven-Docker-Bild ausprobiert habe, an das Sie eine POM-Datei übergeben können, es kann funktionieren, Überlegungen sind 1.) Wenn die Auth außerhalb von Docker ist, wie erhalten Sie andere (inkl. Build-Server/Pipeline) um auch dein Image aufzubauen? und 2.) Wie extrahierst du das Artefakt aus dem Container? (Sie könnten Volume-Mounts verwenden, um dies zu erreichen, aber dies könnte env-spezifische Abhängigkeiten verursachen) – GreensterRox

2

Ich denke, in dem Fall, den Sie beschreiben, macht es Sinn, die Composer-Installation außerhalb des Docker Build zu tun.

Normalerweise haben Sie einen ersten Build-Prozess, der Ihren App-Code erstellt. In diesem Build werden möglicherweise einige automatische Filtertests durchgeführt. Anschließend wird ein Artefakt generiert, das den gesamten Code enthält, der für die Ausführung Ihrer App erforderlich ist. Dies würde aus Ihrem Quellcode, Ihrem Lieferantenordner und jedem automatisch generierten Code (ORM-Klassen, Caches usw.) bestehen. Diese Artefakte sind normalerweise tar-Dateien.

Sie würden dann dieses Code-Artefakt in Ihren Docker-Container in Ihrem nachfolgenden Docker-Build kopieren. wenn es notwendig sein, ssh später

+0

Ich bin auf diesen Ansatz gelehnt. Ich möchte möglicherweise das Bild nach dem Erstellen testen, und nicht vorher, noch mehr in Anbetracht der Tatsache, dass ich einen MySQL-Container benötigen könnte. Warum sollte ich die Datei tar? Mein letztes Bild ist wahrscheinlich ein php/apache Bild. – NiRR

0

Sie können jederzeit einen Build machen, die ~/.ssh kopiert, führen Komponist installieren und dann rm Schlüssel ... danach, - in Docker-compose (oder normal by -v) mounten Sie einfach .ssh lokal mit Volumen/-V während des Laufs :)

Verwandte Themen