Ich habe diesen Code aus scheinbar verschiedenen Docker-Dateien kopiert. Hier ist meine:
FROM ubuntu
MAINTAINER Luke Crooks "[email protected]"
# Update aptitude with new repo
RUN apt-get update
# Install software
RUN apt-get install -y git python-virtualenv
# Make ssh dir
RUN mkdir /root/.ssh/
# Copy over private key, and set permissions
ADD id_rsa /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
RUN chown -R root:root /root/.ssh
# Create known_hosts
RUN touch /root/.ssh/known_hosts
# Remove host checking
RUN echo "Host bitbucket.org\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config
# Clone the conf files into the docker container
RUN git clone [email protected]:Pumalo/docker-conf.git /home/docker-conf
Das gibt mir den Fehler
Step 10 : RUN git clone [email protected]:Pumalo/docker-conf.git /home/docker-conf
---> Running in 0d244d812a54
Cloning into '/home/docker-conf'...
Warning: Permanently added 'bitbucket.org,131.103.20.167' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
2014/04/30 16:07:28 The command [/bin/sh -c git clone [email protected]:Pumalo/docker-conf.git /home/docker-conf] returned a non-zero code: 128
Ich verwende Docker-Dateien zum ersten Mal, aber nach dem, was ich gelesen (und aus Arbeitskonfigurationen entnommen) habe, kann ich nicht erkennen, warum dies nicht funktioniert.
Meine id_rsa befindet sich im selben Ordner wie meine Docker-Datei und ist eine Kopie meines lokalen Schlüssels, mit dem dieses Repo problemlos geklont werden kann.
Bearbeiten:
In meiner Docker-Datei kann ich hinzufügen:
RUN cat /root/.ssh/id_rsa
Und es druckt den richtigen Schlüssel aus, sodass ich weiß, dass er korrekt kopiert wird.
Ich habe auch versucht, das zu tun, was Noah geraten hat und lief:
RUN echo "Host bitbucket.org\n\tIdentityFile /root/.ssh/id_rsa\n\tStrictHostKeyChecking no" >> /etc/ssh/ssh_config
Das funktioniert leider auch nicht.
ssh-keyscan
das Standard-Timeout 5 Sekunden beträgt, das Bitbucket oft überschritten hat.ssh-keyscan
meldet nicht einmal einen Fehler. Also besser laufenRUN ssh-keyscan -T 60 bitbucket.org >> /root/.ssh/known_hosts
, um sicher zu gehen.ssh-keyscan
ein Problem ist? Mein Verständnis ist, dass es einfach den öffentlichen Schlüssel von Github / Bitbucket ziehen wird. Welche Alternative kann verwendet werden, damit sie nicht in einer Ebene endet?known_hosts
Datei. Die Leute stimmen nur zufälligen Dingen zu, wenn sie alarmierend genug klingen.Sie sollten einen neuen SSH-Schlüsselsatz für dieses Docker-Image erstellen, da Sie dort wahrscheinlich keinen eigenen privaten Schlüssel einbetten möchten. Damit es funktioniert, müssen Sie diesen Schlüssel zu den Bereitstellungsschlüsseln in Ihrem Git-Repository hinzufügen. Hier ist das komplette Rezept:
Generieren Sie SSH-Schlüssel, mit
ssh-keygen -q -t rsa -N '' -f repo-key
denen Sie Repo-Key- und Repo-key.pub-Dateien erhalten.Fügen Sie repo-key.pub zu Ihren Repository-Bereitstellungsschlüsseln hinzu.
Gehen Sie auf GitHub zu [Ihrem Repository] -> Einstellungen -> Schlüssel bereitstellen
Fügen Sie Ihrer Docker-Datei so etwas hinzu:
Beachten Sie, dass oben StrictHostKeyChecking deaktiviert ist, sodass Sie keine .ssh / unknown_hosts benötigen. Obwohl mir die Lösung mit ssh-keyscan in einer der obigen Antworten wahrscheinlich besser gefällt.
quelle
fatal: Could not read from remote repository.
Es ist nicht nötig, mit SSH-Konfigurationen herumzuspielen. Verwenden Sie eine Konfigurationsdatei (keine Docker-Datei), die Umgebungsvariablen enthält, und lassen Sie Ihre Docker-Datei zur Laufzeit von einem Shell-Skript aktualisieren. Sie halten Token von Ihren Docker-Dateien fern und können über https klonen (keine Notwendigkeit, SSH-Schlüssel zu generieren oder weiterzugeben).
Gehen Sie zu Einstellungen> Persönliche Zugriffstoken
repo
aktiviertem Gültigkeitsbereich.git clone https://[email protected]/user-or-org/repo
Einige Kommentatoren haben festgestellt, dass bei Verwendung einer freigegebenen Docker-Datei Ihr Zugriffsschlüssel anderen Personen in Ihrem Projekt zugänglich gemacht werden kann. Dies kann für Ihren speziellen Anwendungsfall von Belang sein oder auch nicht. Hier sind einige Möglichkeiten, wie Sie damit umgehen können:
sed
oder eine ähnliche Variable , dh rufen Sie das Skript auf, durchsh rundocker.sh MYTOKEN=foo
das on ersetzt werden sollhttps://{{MY_TOKEN}}@github.com/user-or-org/repo
. Beachten Sie, dass Sie auch eine Konfigurationsdatei (in .yml oder einem beliebigen Format) verwenden können, um dasselbe zu tun, jedoch mit Umgebungsvariablen.quelle
Settings > Applications
?Eine weitere Option ist die Verwendung eines mehrstufigen Docker-Builds, um sicherzustellen, dass Ihre SSH-Schlüssel nicht im endgültigen Image enthalten sind.
Wie in meinem Beitrag beschrieben , können Sie Ihr Zwischenbild mit den erforderlichen Abhängigkeiten zum Git-Klon und dann
COPY
den erforderlichen Dateien in Ihr endgültiges Bild vorbereiten .Wenn wir
LABEL
unsere Zwischenschichten verwenden, können wir sie sogar von der Maschine löschen, wenn wir fertig sind.Wir können dann bauen:
Beweisen Sie, dass unsere SSH-Schlüssel weg sind:
Bereinigen Sie Zwischenbilder von der Build-Maschine:
quelle
RUN
tun, damit Sie den Schlüssel nicht in einer vorherigen Bildebene belassen. Ab Docker können1.13
Sie das--squash
experimentelle Argument verwenden, mit dem der SSH-Schlüssel auch in Ihren endgültigen Bildebenen entfernt wird.Generieren Sie für das Bitbucket-Repository ein App-Passwort (Bitbucket-Einstellungen -> Zugriffsverwaltung -> App-Passwort, siehe Abbildung) mit Lesezugriff auf das Repo und das Projekt.
Dann ist der Befehl, den Sie verwenden sollten:
quelle
--recursive
habe nicht funktioniert. Ich musstegit clone
für jedes Submodul einfügen, was in Ordnung ist, aber großartig gewesen wäre, wenn es rekursiv funktioniert hätte.Sie möchten häufig kein
git clone
privates Repo innerhalb des Docker-Builds ausführen . Wenn Sie den Klon dort ausführen, platzieren Sie die privaten SSH-Anmeldeinformationen im Image, wo sie später von jedem extrahiert werden können, der Zugriff auf Ihr Image hat.Stattdessen ist es üblich, das Git-Repo von außerhalb des Dockers in das CI-Tool Ihrer Wahl und einfach
COPY
die Dateien in das Image zu klonen . Dies hat einen zweiten Vorteil: Docker-Caching. Beim Docker-Caching werden der ausgeführte Befehl, die darin enthaltenen Umgebungsvariablen, Eingabedateien usw. untersucht. Wenn sie mit einem vorherigen Build aus demselben übergeordneten Schritt identisch sind, wird dieser vorherige Cache wiederverwendet. Bei einemgit clone
Befehl ist der Befehl selbst identisch, sodass Docker den Cache auch dann wiederverwendet, wenn das externe Git-Repo geändert wird. EinCOPY
Befehl überprüft jedoch die Dateien im Erstellungskontext und kann feststellen, ob sie identisch sind oder aktualisiert wurden. Der Cache wird nur verwendet, wenn dies angemessen ist.Wenn Sie Ihrem Build Anmeldeinformationen hinzufügen möchten, sollten Sie dies mit einem mehrstufigen Build tun und diese Anmeldeinformationen nur in einem frühen Stadium platzieren, das niemals markiert und außerhalb Ihres Build-Hosts verschoben wird. Das Ergebnis sieht aus wie:
In jüngerer Zeit hat BuildKit einige experimentelle Funktionen getestet, mit denen Sie einen SSH-Schlüssel als Mount übergeben können, der niemals in das Image geschrieben wird:
Und das können Sie bauen mit:
Beachten Sie, dass Ihr SSH-Schlüssel weiterhin nicht kennwortgeschützt sein muss. Sie können den Build jedoch zumindest in einer einzigen Phase ausführen, einen COPY-Befehl entfernen und verhindern, dass der SSH-Berechtigungsnachweis jemals Teil eines Images wird.
BuildKit hat außerdem eine Funktion nur für ssh hinzugefügt, mit der Sie Ihre passwortgeschützten ssh-Schlüssel weiterhin haben können. Das Ergebnis sieht folgendermaßen aus:
Und das können Sie bauen mit:
Dies wird wiederum in den Build eingefügt, ohne jemals in eine Bildebene geschrieben zu werden, wodurch das Risiko beseitigt wird, dass der Berechtigungsnachweis versehentlich ausläuft.
Um Docker zu zwingen, das
git clone
selbst auszuführen , wenn die Zeilen zuvor zwischengespeichert wurden, können Sie ein Build-ARG einfügen, das sich mit jedem Build ändert, um den Cache zu unterbrechen. Das sieht aus wie:Dann fügen Sie dieses sich ändernde Argument in den Docker-Build-Befehl ein:
quelle
Die oben genannten Lösungen funktionierten bei Bitbucket nicht. Ich dachte, das macht den Trick:
quelle