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

15voto

Dan Keder Punkte 684

Diese Zeile ist ein Problem:

ADD ../../home/ubuntu/.ssh/id_rsa /root/.ssh/id_rsa

Wenn Sie die Dateien angeben, die Sie in das Image kopieren möchten, können Sie nur relative Pfade verwenden - relativ zum Verzeichnis, in dem sich Ihr Dockerfile befindet. Sie sollten stattdessen verwenden:

ADD id_rsa /root/.ssh/id_rsa

Und legen Sie die Datei id_rsa in das gleiche Verzeichnis, in dem sich Ihr Dockerfile befindet.

Weitere Details finden Sie hier: http://docs.docker.io/reference/builder/#add

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

15voto

MrE Punkte 16859

Docker-Container sollten als eigene 'Services' angesehen werden. Um Bedenken zu trennen, sollten Funktionalitäten getrennt werden:

1) Daten sollten in einem Daten-Container sein: Verwenden Sie ein verknüpftes Volume, um das Repository zu klonen. Dieser Datencontainer kann dann mit dem benötigten Service verknüpft werden.

2) Verwenden Sie einen Container, um die Git-Klon-Aufgabe auszuführen (d.h. nur das Klonen ist seine Aufgabe), verknüpfen Sie den Daten-Container damit, wenn Sie ihn starten.

3) Gleiches gilt für den SSH-Schlüssel: Legen Sie ihn in einem Volume ab (wie oben vorgeschlagen) und verknüpfen Sie ihn mit dem Git-Klon-Service, wenn Sie ihn benötigen.

Auf diese Weise sind sowohl die Klon-Aufgabe als auch der Schlüssel vergänglich und nur aktiv, wenn sie gebraucht werden.

Jetzt, wenn Ihre App selbst eine Git-Schnittstelle ist, sollten Sie möglicherweise die GitHub- oder Bitbucket-REST-APIs direkt verwenden, um Ihre Arbeit zu erledigen: Dafür wurden sie entworfen.

14voto

Devesh Punkte 939

Sie können mehrstufige Build verwenden, um Container zu erstellen Das ist der Ansatz, den Sie wählen können:

Phase 1: Erstellen eines Images mit SSH

FROM ubuntu as sshImage
LABEL stage=sshImage
ARG SSH_PRIVATE_KEY
WORKDIR /root/temp

RUN apt-get update && \
    apt-get install -y git npm 

RUN mkdir /root/.ssh/ &&\
    echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa &&\
    chmod 600 /root/.ssh/id_rsa &&\
    touch /root/.ssh/known_hosts &&\
    ssh-keyscan github.com >> /root/.ssh/known_hosts

COPY package*.json ./

RUN npm install

RUN cp -R node_modules prod_node_modules

Phase 2: Erstellen Sie Ihren Container

FROM node:10-alpine

RUN mkdir -p /usr/app

WORKDIR /usr/app

COPY ./ ./

COPY --from=sshImage /root/temp/prod_node_modules ./node_modules

EXPOSE 3006

CMD ["npm", "run", "dev"] 

Fügen Sie dem Compose-Datei das env-Attribut hinzu:

   environment:
      - SSH_PRIVATE_KEY=${SSH_PRIVATE_KEY}

Übergeben Sie dann die Argumente aus dem Build-Skript wie folgt:

docker-compose build --build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)"

Und entfernen Sie den Zwischencontainer aus Sicherheitsgründen. Das wird Ihnen helfen. Prost.

13voto

tojo Punkte 606

Ich bin heute auf das gleiche Problem gestoßen und habe eine leicht modifizierte Version mit den vorherigen Beiträgen gefunden. Ich fand diesen Ansatz für mich nützlicher

docker run -it -v ~/.ssh/id_rsa:/root/.my-key:ro image /bin/bash

(Beachten Sie die schreibgeschützte Flagge, damit der Container meinen SSH-Schlüssel auf keinen Fall durcheinander bringt.)

Im Container kann ich jetzt Folgendes ausführen:

ssh-agent bash -c "ssh-add ~/.my-key; git clone  "

So erhalte ich nicht diesen Bad owner or permissions on /root/.ssh/.. Fehler, der von @kross erwähnt wurde

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