Docker Container SSL-Zertifikate

85

Gibt es eine elegante Möglichkeit, Bildern, die von Docker Pull stammen, SSL-Zertifikate hinzuzufügen?

Ich suche nach einer einfachen und reproduzierbaren Möglichkeit, eine Datei in / etc / ssl / certs hinzuzufügen und update-ca-certificates auszuführen. (Dies sollte Ubuntu- und Debian-Bilder abdecken).

Ich verwende Docker unter CoreOS und der Coreos-Computer vertraut den erforderlichen SSL-Zertifikaten, aber die Docker-Container haben offensichtlich nur den Standard.

Ich habe versucht docker run --entrypoint=/bin/bash, das Zertifikat hinzuzufügen und auszuführen update-ca-certificates, aber dies scheint den Einstiegspunkt dauerhaft zu überschreiben.

Ich frage mich jetzt auch, ob es eleganter wäre, nur /etc/ssl/certsvon der Kopie des Host-Computers auf den Container zu montieren . Dies würde implizit ermöglichen, dass die Container denselben Dingen wie der Host vertrauen.

Ich arbeite mit einem nervigen Proxy, der alles aufgibt :(. Das bricht SSL und macht die Arbeit mit Containern irgendwie seltsam.

Beau Trepp
quelle
3
Haben Sie darüber nachgedacht, eine Docker-Datei zu erstellen, die Ihr Image verwendet, die Datei hinzufügt und update-ca-certificates ausführt? oder ist das nicht was du suchst?
Céline Aussourd
Ich habe das für einige Bilder getan. Es ist keine schlechte Lösung. Erfordert jedoch, dass Sie auf allen Bildern mit Ihren eigenen aufbauen.
Beau Trepp

Antworten:

71

Montieren Sie die Zertifikate auf dem Docker- Container mit -v:

docker run -v /host/path/to/certs:/container/path/to/certs -d IMAGE_ID "update-ca-certificates"
cdrev
quelle
5
Das ist ziemlich geschickt. Wenn der Container den gleichen Stil von ssl_certs verwendet, würden Sie nicht einmal die Zeile update-ca-certificates benötigen, der Host hätte dies bereits getan :).
Beau Trepp
2
und wenn wir in der Cloud bauen?
Ewoks
26

Ich versuche etwas Ähnliches zu tun. Wie oben kommentiert, möchten Sie dann ein neues Image mit einer benutzerdefinierten Docker-Datei (unter Verwendung des Images, das Sie als Basis-Image gezogen haben), ADDIhrem Zertifikat, erstellen RUN update-ca-certificates. Auf diese Weise erhalten Sie jedes Mal einen konsistenten Status, wenn Sie einen Container von diesem neuen Image aus starten.

# Dockerfile
FROM some-base-image:0.1
ADD you_certificate.crt:/container/cert/path
RUN update-ca-certificates

Nehmen wir an, eine docker buildgegen diese Docker-Datei erzeugte IMAGE_ID. Beim nächsten Mal docker run -d [any other options] IMAGE_IDenthält der mit diesem Befehl gestartete Container Ihre Zertifikatinformationen. Einfach und reproduzierbar.

Shudgston
quelle
Normalerweise würde ich die Docker-Run-V-Lösung bevorzugen, die in anderen Antworten erwähnt wird. Ihre Lösung funktioniert jedoch auch, wenn Sie während der Docker-Erstellung Zertifikate benötigen. Vielen Dank!
Bastian
8
Ich wäre vorsichtig, wenn ich Zertifikate in einen öffentlichen Container stecken würde. Jemand anderes könnte Ihren Container ziehen und Ihre privaten Zertifikate extrahieren.
Skibum55
4
Das ist zwar ein sehr guter Punkt, aber die obige Lösung macht nichts öffentlich. Dies soll Ihre eigenen Zertifikate zu einem Image hinzufügen, das lokal erstellt und dann privat verwendet wird. Sie könnten das resultierende Image dann in ein öffentliches Repository verschieben, aber das wäre, wie Sie sagten, eine schlechte Idee.
Shudgston
9
Seit wann sind Zertifikate geheim?
Techraf
3
Da Ihr Server einen privaten Schlüssel benötigt, der mit dem veröffentlichten Zertifikat übereinstimmt.
John Rix
21

Wie in einem Kommentar oben vorgeschlagen , können Sie den Zertifikatspeicher auf dem Host, wenn er mit dem Gast kompatibel ist, einfach direkt bereitstellen.

Auf einem Debian-Host (und Container) habe ich erfolgreich Folgendes ausgeführt:

docker run -v /etc/ssl/certs:/etc/ssl/certs:ro ...
Jonathon Reinhart
quelle
Was tun beim Erstellen eines Docker-Images auf dem Build-Server? : /
Ewoks
@Ewoks Sie können Ihre Zertifikate auf einem privaten DNS hosten und in Ihre Helmkarten laden und das Erstellen des Volumes in Ihrem Cluster automatisieren.
Bassam Gamal
0

Sie können den relativen Pfad verwenden, um das Volume in den Container einzubinden:

docker run -v `pwd`/certs:/container/path/to/certs ...

Beachten Sie das hintere Häkchen auf dem, pwddas Ihnen das aktuelle Arbeitsverzeichnis gibt. Es wird davon ausgegangen, dass Sie den certsOrdner im aktuellen Verzeichnis haben, in dem der docker runausgeführt wird. Ein bisschen großartig für die lokale Entwicklung und halten Sie den Ordner "certs" für Ihr Projekt sichtbar.

alltej
quelle