Spesso non si desidera eseguire un git clone
repository privato all'interno della build docker. Fare il clone lì implica posizionare le credenziali ssh private all'interno dell'immagine dove possono essere successivamente estratte da chiunque abbia accesso alla tua immagine.
Invece, la pratica comune è clonare il repository git dall'esterno della finestra mobile nello strumento di scelta rapida scelto e semplicemente COPY
i file nell'immagine. Questo ha un secondo vantaggio: la memorizzazione nella finestra mobile. La memorizzazione nella cache Docker esamina il comando in esecuzione, le variabili di ambiente che include, i file di input, ecc. E se sono identici a una build precedente dallo stesso passaggio principale, riutilizza la cache precedente. Con un git clone
comando, il comando stesso è identico, quindi la finestra mobile riutilizza la cache anche se viene modificato il repository git esterno. Tuttavia, un COPY
comando esaminerà i file nel contesto di compilazione e potrà vedere se sono identici o se sono stati aggiornati e utilizzare la cache solo quando è appropriato.
Se hai intenzione di aggiungere credenziali alla tua build, prendi in considerazione la possibilità di farlo con una build multi-stage e ponendo solo quelle credenziali in una fase iniziale che non viene mai taggata e spinta all'esterno del tuo host di build. Il risultato è simile a:
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
...
Più di recente, BuildKit ha testato alcune funzionalità sperimentali che consentono di passare una chiave ssh come mount che non viene mai scritto nell'immagine:
# 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
E puoi costruirlo con:
$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
--secret id=ssh_id,src=$(pwd)/id_rsa .
Nota che questo richiede ancora che la tua chiave ssh non sia protetta da password, ma puoi almeno eseguire la build in una singola fase, rimuovendo un comando COPY ed evitando che le credenziali ssh facciano parte di un'immagine.
BuildKit ha anche aggiunto una funzione solo per ssh che ti consente di avere ancora le tue chiavi ssh protette da password, il risultato è simile:
# 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
E puoi costruirlo con:
$ 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 .
Ancora una volta, questo viene iniettato nella build senza mai essere scritto su un livello immagine, eliminando il rischio che la credenziale possa fuoriuscire accidentalmente.
Per forzare l'esecuzione della finestra mobile git clone
anche quando le linee precedenti sono state memorizzate nella cache, è possibile iniettare un ARG build che cambia con ogni build per interrompere la cache. Sembra che:
# 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
Quindi si inietta quel cambio arg nel comando build docker:
date_stamp=$(date +%Y%m%d-%H%M%S)
docker build --build-arg DATE_STAMP=$date_stamp .