519 Stimmen

Verwendung von SSH-Schlüsseln innerhalb eines Docker-Containers

Ich habe eine App, die verschiedene lustige Dinge mit Git ausführt (wie das Ausführen von git clone & git push) und ich versuche, sie zu dockerisieren.

Ich stoße jedoch auf ein Problem, bei dem ich einem SSH-Schlüssel zum Container hinzufügen muss, damit der 'Benutzer' des Containers ihn verwenden kann.

Ich habe versucht, ihn in /root/.ssh/ zu kopieren, $HOME zu ändern, einen Git SSH-Wrapper zu erstellen, und dennoch kein Glück.

Hier ist das Dockerfile zur Referenz:

#DOCKER-VERSION 0.3.4                                                           

from  ubuntu:12.04                                                              

RUN  apt-get update                                                             
RUN  apt-get install python-software-properties python g++ make git-core openssh-server -y
RUN  add-apt-repository ppa:chris-lea/node.js                                   
RUN  echo "deb http://archive.ubuntu.com/ubuntu precise universe" >> /etc/apt/sources.list
RUN  apt-get update                                                             
RUN  apt-get install nodejs -y                                                  

ADD . /src                                                                       
ADD ../../home/ubuntu/.ssh/id_rsa /root/.ssh/id_rsa                             
RUN   cd /src; npm install                                                      

EXPOSE  808:808                                                                 

CMD   [ "node", "/src/app.js"]

app.js führt die git-Befehle wie git pull aus

64voto

funnydman Punkte 4245

Dies ist jetzt seit dem Release am 18.09 verfügbar!

Gemäß der Dokumentation:

Der Docker-Befehl build verfügt über eine --ssh-Option, um es dem Docker Engine zu ermöglichen, SSH-Agent-Verbindungen weiterzuleiten.

Hier ist ein Beispiel für ein Dockerfile, das SSH im Container verwendet:

# syntax=docker/dockerfile:experimental
FROM alpine

# Installieren Sie den SSH-Client und Git
RUN apk add --no-cache openssh-client git

# Öffentlichen Schlüssel für github.com herunterladen
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

# Privates Repository klonen
RUN --mount=type=ssh git clone git@github.com:myorg/myproject.git myproject

Sobald das Dockerfile erstellt ist, verwenden Sie die --ssh-Option für die Konnektivität mit dem SSH-Agenten:

$ docker build --ssh default .

Schauen Sie sich auch https://medium.com/@tonistiigi/build-secrets-and-ssh-forwarding-in-docker-18-09-ae8161d066 an

42voto

creack Punkte 115860

Um Ihren SSH-Schlüssel innerhalb eines Containers zu injizieren, haben Sie mehrere Lösungen:

  1. Mit einem Dockerfile und der Anweisung ADD können Sie ihn während des Build-Vorgangs injizieren

  2. Einfach etwas wie cat id_rsa | docker run -i sh -c 'cat > /root/.ssh/id_rsa'

  3. Verwenden Sie den Befehl docker cp, mit dem Sie Dateien in einen laufenden Container injizieren können.

34voto

Mohammad Azim Punkte 2279

Eine plattformübergreifende Lösung besteht darin, ein Bind-Mount zu verwenden, um den .ssh-Ordner des Hosts für den Container freizugeben:

docker run -v /home//.ssh:/home//.ssh 

Ähnlich wie beim Agent-Forwarding wird dieser Ansatz die öffentlichen Schlüssel für den Container zugänglich machen. Ein zusätzlicher Vorteil ist, dass er auch mit einem nicht-root-Benutzer funktioniert und eine Verbindung zu GitHub herstellt. Einige zu bedenkende Einschränkungen sind jedoch, dass alle Inhalte (einschließlich privater Schlüssel) aus dem .ssh-Ordner freigegeben werden. Daher ist dieser Ansatz nur für die Entwicklung und nur für vertrauenswürdige Container-Images wünschenswert.

30voto

Edison Arango Punkte 716

Ausgehend von docker API 1.39+ (Überprüfen Sie die API-Version mit docker version) ermöglicht docker build die Verwendung der Option --ssh mit entweder einem Agenten-Socket oder Schlüsseln, um dem Docker Engine das Weiterleiten von SSH-Agent-Verbindungen zu ermöglichen.

Build-Befehl

export DOCKER_BUILDKIT=1
docker build --ssh default=~/.ssh/id_rsa .

Dockerfile

# syntax=docker/dockerfile:experimental
FROM python:3.7

# Installiere den SSH-Client (falls erforderlich)
RUN apt-get update -qq
RUN apt-get install openssh-client -y

# Lade den öffentlichen Schlüssel für github.com herunter
RUN --mount=type=ssh mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

# Klonen des privaten Repository
RUN --mount=type=ssh git clone git@github.com:myorg/myproject.git myproject

Weitere Informationen:

15voto

Markko Paas Punkte 789

Wir hatten ein ähnliches Problem, als wir npm install im Docker-Build-Prozess durchführten.

Inspiriert von der Lösung von Daniel van Flymen und in Kombination mit git url rewrite fanden wir eine etwas einfachere Methode zur Authentifizierung bei npm-Installationen aus privaten Github-Repositorien - wir verwendeten oauth2-Token anstelle von Schlüsseln.

In unserem Fall waren die npm-Abhängigkeiten als "git+https://github.com/..." angegeben.

Zur Authentifizierung im Container müssen die URLs so umgeschrieben werden, dass sie entweder für die SSH-Authentifizierung geeignet sind (ssh://git@github.com/) oder für die Token-Authentifizierung (https://${GITHUB\_TOKEN}@github.com/)

Build-Befehl:

docker build -t sometag --build-arg GITHUB_TOKEN=$GITHUB_TOKEN . 

Leider bin ich auf docker 1.9, daher gibt es die Option --squash noch nicht, sie muss schließlich hinzugefügt werden

Dockerfile:

FROM node:5.10.0

ARG GITHUB_TOKEN

#Install dependencies
COPY package.json ./

# Füge eine Umleitungsregel hinzu, um den GitHub-Benutzer zu authentifizieren
RUN git config --global url."https://${GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/"

RUN npm install

# Entferne den geheimen Token aus der Git-Konfigurationsdatei, denke daran, --squash-Option für den Docker-Build zu verwenden, wenn sie in Docker 1.13 verfügbar wird
RUN git config --global --unset url."https://${GITHUB_TOKEN}@github.com/".insteadOf

# Die Ports, die die App verwendet, freigeben
EXPOSE 8000

# Server- und Client-Code kopieren
COPY server /server 
COPY clients /clients

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X