Lors de la création d'une image Docker via Dockerfile, je dois cloner un dépôt Github. J'ai ajouté mes clés ssh publiques à mon compte hub git et je suis en mesure de cloner le dépôt à partir de mon hôte docker. Tandis que je vois que je peux utiliser la clé ssh de l'hôte de docker en mappant la variable env $SSH_AUTH_SOCK
Au moment de l'exécution de docker comme docker run --rm -it --name container_name \ -v $(dirname $SSH_AUTH_SOCK):$(dirname $SSH_AUTH_SOCK) \ -e SSH_AUTH_SOCK=$SSH_AUTH_SOCK my_image
.
Comment puis-je faire de même lors de la construction d'un docker?
Vous pouvez utiliser les nouvelles fonctionnalités de Docker pour transférer votre connexion d'agent SSH existante ou une clé au générateur. Cela permet par exemple de cloner vos référentiels privés lors de la construction.
Étapes:
Première variable d'environnement définie pour utiliser le nouveau BuildKit
export DOCKER_BUILDKIT=1
Ensuite, créez Dockerfile avec une nouvelle syntaxe (expérimentale):
# syntax=docker/dockerfile:experimental
FROM Alpine
# install ssh client and git
RUN apk add --no-cache openssh-client git
# download public key for github.com
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
# clone our private repository
RUN --mount=type=ssh git clone [email protected]:myorg/myproject.git myproject
Et construire l'image avec
docker build --ssh default .
En savoir plus à ce sujet ici: https://medium.com/@tonistiigi/build-secrets-and-ssh-forwarding-in-docker-18-09-ae8161d066
Malheureusement, vous ne pouvez pas transférer votre socket ssh vers le conteneur de génération car les montages de volume au moment de la construction ne sont actuellement pas pris en charge dans Docker.
Cela a été un sujet de discussion depuis un bon moment maintenant, consultez les problèmes suivants sur GitHub pour référence:
Comme vous pouvez le voir, cette fonctionnalité a été demandée plusieurs fois pour différents cas d'utilisation. Jusqu'à présent, les responsables ont hésité à résoudre ce problème car ils estiment que le volume monté pendant la génération romprait la portabilité:
le résultat d'une construction doit être indépendant de l'hôte sous-jacent
Comme indiqué dans la discussion this .
Cela peut être résolu en utilisant un script de construction alternatif. Par exemple, vous pouvez créer un script bash et le placer dans ~/usr/local/bin/docker-compose
Ou dans votre emplacement préféré:
#!/bin/bash
trap 'kill $(jobs -p)' EXIT
socat TCP-LISTEN:56789,reuseaddr,fork UNIX-CLIENT:${SSH_AUTH_SOCK} &
/usr/bin/docker-compose $@
Ensuite, dans votre Dockerfile, vous utiliseriez votre socket ssh existant:
...
ENV SSH_AUTH_SOCK /tmp/auth.sock
...
&& apk add --no-cache socat openssh \
&& /bin/sh -c "socat -v UNIX-LISTEN:${SSH_AUTH_SOCK},unlink-early,mode=777,fork TCP:172.22.1.11:56789 &> /dev/null &" \
&& bundle install \
...
or any other ssh commands will works
Vous pouvez maintenant appeler notre docker-compose build
Personnalisé. Il appellerait le script docker réel avec une socket ssh partagée.
Celui-ci est également intéressant:
On dirait:
mkfifo myfifo
nc -lk 12345 <myfifo | nc -U $SSH_AUTH_SOCK >myfifo
RUN mkfifo myfifo
RUN while true; do \
nc 172.17.0.1 12345 <myfifo | nc -Ul /tmp/ssh-agent.sock >myfifo \
done &
RUN export SSH_AUTH_SOCK=/tmp/ssh-agent.sock
RUN ssh ...