web-dev-qa-db-fra.com

Comment passer la clé SSH de la machine locale au conteneur Docker?

J'essaie de créer une image Docker à partir de Dockerfile et l'une des étapes à suivre consiste à installer une dépendance qui n'est disponible que via le référentiel Gitlab privé. Cela signifie que le conteneur devra avoir accès aux clés SSH pour effectuer le clonage. Je sais que ce n'est pas l'approche la plus sécurisée, mais cela ne sera qu'un conteneur intermédiaire qui sera supprimé une fois que tous les composants nécessaires au fonctionnement de l'application seront en place.

Le problème est que je ne peux pas, quoi que j'essaye, obtenir l'agent ssh dans docker pour établir la connexion. Je reçois:

npm ERR! Host key verification failed.
npm ERR! fatal: Could not read from remote repository.
npm ERR! 
npm ERR! Please make sure you have the correct access rights
npm ERR! and the repository exists.

La même chose se produit si j'essaye de simplement cloner le référentiel sans exécuter npm install. Voici le Dockerfile que j'utilise:

FROM risingstack/Alpine:3.4-v6.9.4-4.2.0


RUN apk update

RUN apk add openssh

ARG SSH_KEY

# Authorize SSH Host
RUN mkdir -p /root/.ssh && \
    chmod 700 /root/.ssh && \
    ssh-keyscan github.com > /root/.ssh/known_hosts

# Add the keys and set permissions
RUN echo "$SSH_KEY" > /root/.ssh/id_rsa && \
    chmod 700 /root/.ssh/id_rsa && \


RUN eval "$(ssh-agent -s)" && ssh-add /root/.ssh/id_rsa && ssh -o StrictHostKeyChecking=no [email protected] || true && npm install

et la commande (je passe la clé privée comme argument de construction):

docker build -t test  --build-arg SSH_KEY="$(cat ~/.ssh/id_rsa)" .
4

Je le clonerais sur l'hôte, en utilisant l'agent ssh que vous avez déjà en cours d'exécution, avant d'exécuter docker build.

Si vous devez vraiment avoir la clé privée dans l'image (que vous avez reconnue dangereuse), vous devriez pouvoir l'avoir à son emplacement par défaut $HOME/.ssh/id_rsa où vous l'avez dans votre code; n'essayez pas de lancer un agent ssh. Vous pouvez également injecter un $HOME/.ssh/config fichier si votre problème est une vérification agressive de la clé hôte ou un $HOME/.ssh/known_hosts fichier contenant déjà la clé Host. Étant donné que tous ces éléments sont fichiers, il peut être plus facile de les avoir dans l'arborescence de construction Docker et de COPY dans $HOME/.ssh.

1
David Maze

Cela fonctionne pour moi:

Utilisation de cette solution de contournement: https://stackoverflow.com/a/47544999/3957754 pour passer des fichiers en tant qu'arguments de génération

Dockerfile

ARG SSH_KEY
ENV SSH_KEY=$SSH_KEY

# Make ssh dir
RUN mkdir /root/.ssh/

# Create id_rsa from string arg, and set permissions

RUN echo "$SSH_KEY" > /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa

# Create known_hosts
RUN touch /root/.ssh/known_hosts

# Add git providers to known_hosts
RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
RUN ssh-keyscan gitlab.com >> /root/.ssh/known_hosts

Build

docker build -t some-app --build-arg SSH_KEY="$(cat ~/file/outside/build/context/id_rsa)" .

Avec cela, vous pouvez effectuer git clone [email protected] ... (gitlab ou bitbucket) au stade de la construction ou au stade de l'exécution en utilisant ENTRYPOINT ["docker-entrypoint.sh"].

5
JRichardsz