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 einem git clone
Befehl ist der Befehl selbst identisch, sodass Docker den Cache auch dann wiederverwendet, wenn das externe Git-Repo geändert wird. Ein COPY
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:
FROM ubuntu as clone
# Update aptitude with new repo
RUN apt-get update \
&& apt-get install -y git
# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
&& touch /root/.ssh/known_hosts \
&& ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
# Copy over private key, and set permissions
# Warning! Anyone who gets their hands on this image will be able
# to retrieve this private key file from the corresponding image layer
COPY id_rsa /root/.ssh/id_rsa
# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:User/repo.git
FROM ubuntu as release
LABEL maintainer="Luke Crooks <luke@pumalo.org>"
COPY --from=clone /repo /repo
...
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:
# syntax=docker/dockerfile:experimental
FROM ubuntu as clone
LABEL maintainer="Luke Crooks <luke@pumalo.org>"
# Update aptitude with new repo
RUN apt-get update \
&& apt-get install -y git
# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
&& touch /root/.ssh/known_hosts \
&& ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
# Clone the conf files into the docker container
RUN --mount=type=secret,id=ssh_id,target=/root/.ssh/id_rsa \
git clone git@bitbucket.org:User/repo.git
Und das können Sie bauen mit:
$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
--secret id=ssh_id,src=$(pwd)/id_rsa .
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:
# syntax=docker/dockerfile:experimental
FROM ubuntu as clone
LABEL maintainer="Luke Crooks <luke@pumalo.org>"
# Update aptitude with new repo
RUN apt-get update \
&& apt-get install -y git
# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
&& touch /root/.ssh/known_hosts \
&& ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
# Clone the conf files into the docker container
RUN --mount=type=ssh \
git clone git@bitbucket.org:User/repo.git
Und das können Sie bauen mit:
$ eval $(ssh-agent)
$ ssh-add ~/.ssh/id_rsa
(Input your passphrase here)
$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
--ssh default=$SSH_AUTH_SOCK .
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:
# inject a datestamp arg which is treated as an environment variable and
# will break the cache for the next RUN command
ARG DATE_STAMP
# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:User/repo.git
Dann fügen Sie dieses sich ändernde Argument in den Docker-Build-Befehl ein:
date_stamp=$(date +%Y%m%d-%H%M%S)
docker build --build-arg DATE_STAMP=$date_stamp .