Souvent, vous ne voulez pas effectuer git clone
de dépôt privé à partir de la génération de docker. Faire le clone là-bas implique de placer les informations d'identification ssh privées à l'intérieur de l'image où elles peuvent être extraites ultérieurement par toute personne ayant accès à votre image.
Au lieu de cela, la pratique courante consiste à cloner le dépôt git depuis l'extérieur de docker dans l'outil CI de votre choix, et simplement COPY
les fichiers dans l'image. Cela a un deuxième avantage: la mise en cache du docker. La mise en cache Docker examine la commande en cours d'exécution, les variables d'environnement qu'elle inclut, les fichiers d'entrée, etc., et si elles sont identiques à une génération précédente de la même étape parent, elle réutilise le cache précédent. Avec une git clone
commande, la commande elle-même est identique, donc docker réutilisera le cache même si le dépôt git externe est modifié. Cependant, une COPY
commande examinera les fichiers dans le contexte de génération et pourra voir s'ils sont identiques ou ont été mis à jour et utiliser le cache uniquement lorsque cela est approprié.
Si vous souhaitez ajouter des informations d'identification à votre build, envisagez de le faire avec une build à plusieurs étapes et en ne plaçant ces informations d'identification qu'à un stade précoce qui n'est jamais balisé et poussé à l'extérieur de votre hôte de build. Le résultat ressemble à:
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
...
Plus récemment, BuildKit a testé certaines fonctionnalités expérimentales qui vous permettent de passer une clé ssh en tant que montage qui n'est jamais écrit sur l'image:
# 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
Et vous pouvez construire cela avec:
$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
--secret id=ssh_id,src=$(pwd)/id_rsa .
Notez que cela nécessite toujours que votre clé ssh ne soit pas protégée par mot de passe, mais vous pouvez au moins exécuter la génération en une seule étape, en supprimant une commande COPY et en évitant que les informations d'identification ssh ne fassent jamais partie d'une image.
BuildKit a également ajouté une fonctionnalité juste pour ssh qui vous permet d'avoir toujours vos clés ssh protégées par mot de passe, le résultat ressemble à:
# 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
Et vous pouvez construire cela avec:
$ 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 .
Encore une fois, cela est injecté dans la génération sans jamais être écrit dans une couche d'image, ce qui élimine le risque que les informations d'identification ne s'échappent accidentellement.
Pour forcer Docker à exécuter le git clone
même lorsque les lignes précédentes ont été mises en cache, vous pouvez injecter un ARG de génération qui change avec chaque génération pour casser le cache. Cela ressemble à ceci:
# 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
Ensuite, vous injectez cet argument changeant dans la commande de construction du docker:
date_stamp=$(date +%Y%m%d-%H%M%S)
docker build --build-arg DATE_STAMP=$date_stamp .