web-dev-qa-db-fra.com

Transfert d'agent SSH lors de la construction du docker

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?

15
Anand

Pour Docker 18.09 et plus récent

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

15
jozo

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 .

5
nardeas

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.

3
Samoilenko Yuri

Celui-ci est également intéressant:

On dirait:

  • Sur l'hôte
mkfifo myfifo
nc -lk 12345 <myfifo | nc -U $SSH_AUTH_SOCK >myfifo
  • Dans le dockerfile
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 ...
0
Dan Pav