J'ai un dépôt privé qui contient des packages que je souhaite installer. J'ai passé pas mal de temps à lire sur divers forums et articles sur différentes façons de le faire en toute sécurité. Il ne semble pas y avoir de consensus sur la meilleure façon de faire cela (si possible). Je ne veux évidemment pas exposer les clés / secrets ssh dans mon dockerfile - je veux faire attention à les rendre disponibles via l'historique du docker.
4 Réponses :
Comme expliqué dans " Créer en toute sécurité une petite image docker python à partir de dépôts git privés ", vous devrez utiliser, avec Docker 18.09+
--ssh
Vous pouvez utiliser l'indicateur--ssh
pour transmettre votre clé d'agent SSH existante au générateur. Au lieu de transférer les données clés, docker informera simplement le constructeur qu'une telle capacité est disponible.
Désormais, lorsque le constructeur a besoin d'accéder à un serveur distant via SSH, il recomposera le client et lui demandera de signer la demande spécifique nécessaire pour cette connexion.
La clé elle-même ne quitte jamais le client, et dès que la commande qui a demandé l'accès est terminée, il n'y a aucune information du côté du constructeur pour rétablir cette connexion à distance plus tard .Secrets :
Fournit une option de montage lors de la construction dans/var/run/secrets
disponible uniquement pour la commande qui l'a utilisée et n'est pas incluse dans la couche créée.
C'est:
RUN --mount=type=ssh,id=github_ssh_key pip wheel \ --no-cache \ --requirement requirements.txt \ --wheel-dir=/app/wheels
seule la connexion de l'agent est partagée avec cette commande, et non le contenu réel de la clé privée.
aucune autre commande / étape du Dockerfile n'y aura accès.
Le Dockerfile, dans une première étape en plusieurs étapes, donnerait un nom de clé github_ssh_key
afin que nous puissions l'utiliser lorsque nous invoquons docker build
:
docker build --ssh github_ssh_key=/path/to/.ssh/git_ssh_id_rsa .
L' OP Jesus Garcia a signalé (dans les commentaires) le fait que cela fonctionne:
J'ai dû utiliser 2 commandes
RUN
distinctes.Je ne sais pas si c'est une limitation de cette nouvelle fonctionnalité, ou de la façon dont j'essayais d'enchaîner plusieurs commandes dans mon
RUN
mais j'ai continué à obtenir une erreur de refus d'autorisation publique lorsque je l'ai ajoutée en tantother commands && /bin/sh -c "mount=type=ssh,id=github_ssh_key pip install private-repo"
vsRUN --mount=type=ssh,id=github_ssh_key pip install private-repo && more commands ...
Je rencontre un problème lors de l'exécution de la partie RUN --mount-type=ssh ...
/bin/sh: 1: --mount=type=ssh,: not found
J'ai fait quelques recherches sur Google, mais je n'ai rien trouvé d'utile.
@JesusGarcia Cela ressemble à: medium.com/@tonistiigi/… . Vous n'utilisez pas le backend BuildKit. Vérifiez votre version de Docker et la section "Utilisation des secrets" de l'article, où vous devez définir DOCKER_BUILDKIT=1
.
J'ai défini DOCKER_BUILDKIT = 1 et je suis également sur la bonne version de docker. J'ai réussi à me débarrasser de l'erreur en l'exécutant en tant que /bin/sh -c "mount=type=ssh,id=github_ssh_key pip install private-repo"
mais /bin/sh -c "mount=type=ssh,id=github_ssh_key pip install private-repo"
maintenant une Permission denied (publickey). #12 35.87 fatal: Could not read from remote repository.
Je l'ai fait fonctionner. J'ai dû utiliser 2 commandes RUN
distinctes. Je ne sais pas si c'est une limitation de cette nouvelle fonctionnalité, ou de la façon dont j'essayais d'enchaîner plusieurs commandes dans mon RUN
mais j'ai continué à obtenir une erreur de refus d'autorisation publique lorsque je l'ai ajoutée en tant other commands && /bin/sh -c "mount=type=ssh,id=github_ssh_key pip install private-repo"
vs RUN --mount=type=ssh,id=github_ssh_key pip install private-repo && more commands ...
Merci de m'avoir pointé vers le --ssh fonctionnalité de drapeau
Cela a fonctionné pour moi avec docker 19.03.5 (mais devrait fonctionner avec 18.09+):
Supposons que votre github.com/user/repo.git
privé se trouve sur Github, github.com/user/repo.git
et que vous souhaitez l' pip install
dans le cadre d'une construction de docker. La clé ssh du dépôt se trouve sur l'hôte à ~/.ssh/my_key
.
Dans le Dockerfile:
export DOCKER_BUILDKIT=1 eval `ssh-agent` ssh-add ~/.ssh/my_key docker build --ssh default=$SSH_AUTH_SOCK .
Ensuite, sur l'hôte:
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts RUN --mount=type=ssh pip install git+ssh://git@github.com/user/repo.git
Malgré l'utilisation de Docker moderne (19.03.8), aucune des solutions ci-dessus n'a fonctionné pour moi (même après avoir ajouté DOCKER_BUILDKIT=1
) sans une ligne supplémentaire que j'ai trouvée dans le billet de blog d'Alexandra Ulsh , ce qui, à mon avis, est suffisamment important pour mériter une réponse supplémentaire. que d'être enterré dans les commentaires.
Bien que l'indicateur
--secret
apparaisse dans une version de production de Docker, il y a quelques indices que la prise en charge est encore quelque peu expérimentale.Par exemple, la première ligne d'un Dockerfile utilisant des secrets de construction doit être
# syntax = docker/dockerfile:1.0-experimental
. Sans cette ligne, vous obtiendrez l'erreurfailed to create LLB definition: Dockerfile parse error line 6: Unknown flag: mount
. Cette ligne permet à la CLI Docker d'utiliser le « frontend Dockerfile expérimental » pour Moby BuildKit.
TL; DR ajoutez le commment # syntax = docker/dockerfile:1.0-experimental
en haut de votre Dockerfile, puis suivez la réponse de Dave Rejkher .
Mise à jour intéressante, plus précise que ma réponse. J'ai voté pour.
Je suis sur Docker version 19.03.13 (build 4484c46d9d), et utiliser la fonction --ssh
comme décrit dans les réponses de VonC et Dave Reikher n'a pas fonctionné pour moi. Je reçois toujours l'erreur suivante:
ERREUR: Erreur de commande avec l'état de sortie 128: git clone -q 'ssh: // git @ hostname: port / group / repository.git' / tmp / pip-install-8eeeaipo / baseapi Vérifiez les journaux pour une sortie de commande complète.
Notez que je ne suis pas en pip install
partir d'un dépôt Github, mais à partir d'un dépôt vraiment privé / interne. Les exemples également tirés de la documentation Docker sur --ssh
montrent également une URL de dépôt "github.com". Je ne suis pas sûr que ce soit le cas (cela ne devrait pas être le cas), mais je l'ai retracé jusqu'à pip
/ git
ne reconnaissant pas le nom d'hôte de l'URL, alors que si vous utilisez "github.com", cela fonctionne comme annoncé.
Je l'ai fait fonctionner à la place en utilisant simplement la fonction --secret
(qui fait toujours partie de BuildKit), en passant la clé SSH ( ~/.ssh/id_rsa
) et le fichier ~/.ssh/known_hosts
comme secrets.
Dockerfile
* Docker: 19.03.13 (build 4484c46d9d) * Image - pip 20.2.4 from /usr/local/lib/python3.8/site-packages/pip (python 3.8) - git 2.22.4 - OpenSSH_8.1p1, OpenSSL 1.1.1g 21 Apr 2020
Commande de construction
/app # ls -l ~/.ssh/ total 0 -rwxr-xr-x 1 root root 0 Nov 19 11:29 id_rsa -rwxr-xr-x 1 root root 0 Nov 19 11:29 known_hosts /app # cat ~/.ssh/id_rsa /app # cat ~/.ssh/known_hosts
J'ai vérifié le dossier ~/.ssh
sur l'image construite et il semble qu'il soit toujours correct de ne pas conserver les clés SSH. Les fichiers montés restent mais ils sont vides:
DOCKER_BUILDKIT=1 docker build \ --secret id=known_hosts,src=~/.ssh/known_hosts \ --secret id=ssh_key,src=~/.ssh/id_rsa \ -t name:tag \ -f Dockerfile \ .
Et essayer d' pip install
le même package privé par pip install
devrait échouer.
Pour référence:
# syntax=docker/dockerfile:1.0-experimental FROM python:3.8-alpine3.11 RUN apk add openssh-client git RUN mkdir -p -m 0600 /root/.ssh RUN --mount=type=secret,id=known_hosts,dst=/root/.ssh/known_hosts \ --mount=type=secret,id=ssh_key,dst=/root/.ssh/id_rsa \ ssh-keyscan -H -t rsa hostname.of.private.repo \ && pip install --no-cache-dir git+ssh://git@hostname:port/group/repository.git@12345678#egg=baseapi
Mise à jour intéressante de ma réponse. J'ai voté pour.