2014-10-02 14 views
7

Ich versuche, einen Container zu starten, die einen Golang-Service aus einem Paket, das ich auf einem privaten GitHub Repo habe.Docker: gehen Sie von einem privaten GitHub Repo

Da ich mit GCE arbeite, ist mein Startbild google/debian: wheezy.

Nachdem alle erforderlichen Abhängigkeiten und Tools installieren, ich bin mit

RUN go get github.com/<my_org>/<my_package> 

wo das Paket eine private Repo ist.

Ich habe meinen GitHub SSH-Schlüssel hinzugefügt, um das Klonen aus dem privaten Repo auf die Docker Datei zu ermöglichen:

ADD priv/id_rsa /root/.ssh/id_rsa 
ADD priv/id_rsa.pub /root/.ssh/id_rsa.pub 

Dennoch erhalte ich einen Fehler während des Prozess gehen bekommen, wenn gehen versuchte, den Repo zu klonen :

# cd .; git clone https://github.com/<my_org>/<my_package> /gopath/src/github.com/<my_org>/<my_package> 
Cloning into '/gopath/src/github.com/<my_org>/<my_package>'... 
fatal: could not read Username for 'https://github.com': No such device or address 
package github.com/<my_org>/<my_package>: exit status 128 

das Problem zu debuggen, vom Dockerfile, ich bin mit:

RUN ssh-keyscan -t rsa github.com 2>&1 >> /root/.ssh/known_hosts 

Und das sagt mir, dass es einige Probleme gibt. Es sieht so aus, als wäre die Validierung des privaten Schlüssels OK, aber etwas Seltsames geht auf den öffentlichen Schlüssel. Dies ist das komplette SSH-keyscan Ergebnis:

OpenSSH_6.0p1 Debian-4+deb7u2, OpenSSL 1.0.1e 11 Feb 2013 
Pseudo-terminal will not be allocated because stdin is not a terminal. 
debug1: Reading configuration data /etc/ssh/ssh_config 
debug1: /etc/ssh/ssh_config line 19: Applying options for * 
debug1: Connecting to github.com [192.30.252.129] port 22. 
debug1: Connection established. 
debug1: permanently_set_uid: 0/0 
debug1: identity file /root/.ssh/id_rsa type 1 
debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048 
debug1: Checking blacklist file /etc/ssh/blacklist.RSA-2048 
debug1: identity file /root/.ssh/id_rsa-cert type -1 
debug1: identity file /root/.ssh/id_dsa type -1 
debug1: identity file /root/.ssh/id_dsa-cert type -1 
debug1: identity file /root/.ssh/id_ecdsa type -1 
debug1: identity file /root/.ssh/id_ecdsa-cert type -1 
debug1: Remote protocol version 2.0, remote software version libssh-0.6.0 
debug1: no match: libssh-0.6.0 
debug1: Enabling compatibility mode for protocol 2.0 
debug1: Local version string SSH-2.0-OpenSSH_6.0p1 Debian-4+deb7u2 
debug1: SSH2_MSG_KEXINIT sent 
debug1: SSH2_MSG_KEXINIT received 
debug1: kex: server->client aes128-ctr hmac-sha1 none 
debug1: kex: client->server aes128-ctr hmac-sha1 none 
debug1: sending SSH2_MSG_KEX_ECDH_INIT 
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY 
debug1: Server host key: RSA 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48 
debug1: Host 'github.com' is known and matches the RSA host key. 
debug1: Found key in /root/.ssh/known_hosts:1 
Warning: Permanently added the RSA host key for IP address '192.30.252.129' to the list of known hosts. 
debug1: ssh_rsa_verify: signature correct 
debug1: SSH2_MSG_NEWKEYS sent 
debug1: expecting SSH2_MSG_NEWKEYS 
debug1: SSH2_MSG_NEWKEYS received 
debug1: Roaming not allowed by server 
debug1: SSH2_MSG_SERVICE_REQUEST sent 
debug1: SSH2_MSG_SERVICE_ACCEPT received 
debug1: Authentications that can continue: publickey 
debug1: Next authentication method: publickey 
debug1: Offering RSA public key: /root/.ssh/id_rsa 
debug1: Server accepts key: pkalg ssh-rsa blen 279 
debug1: key_parse_private_pem: PEM_read_PrivateKey failed 
debug1: read PEM private key done: type <unknown> 
debug1: read_passphrase: can't open /dev/tty: No such device or address 
debug1: Trying private key: /root/.ssh/id_dsa 
debug1: Trying private key: /root/.ssh/id_ecdsa 
debug1: No more authentication methods to try. 
Permission denied (publickey). 

ich versucht habe chmod 600 und chmod 700 auf den priv/öffentlichen Schlüsseln, dies nicht helfen.

Irgendwelche Hinweise? Hat jemand Erfolg beim Laufen bekommen, holt sich das aus privaten Repos auf debian vom Docker?

+0

Laufen Sie Ihre Befehle als root? Sie sollten "go get" mit Ihrem Benutzerkonto verwenden und Ihren Schlüssel in "/ home/yourAccount" speichern. – VonC

+0

Überprüfen Sie die Berechtigungen und die gemeinsamen Einstellungen wie in http://stackoverflow.com/a/19798820/6309 Hilfe? – VonC

Antwort

5

Das habe ich nach ein bisschen hacken herausgefunden. Keine ideale Lösung, da SSH installiert und ein privater Schlüssel in den Container eingebaut wird. Dieses Beispiel basiert auf dem offiziellen Docker golang image (Debian Wheezy):

Der Hauptunterschied zu Ihrem Beispiel besteht darin, dass Sie einen Git-Konfigurationsbefehl benötigen, um SSH statt der Standard-HTTPS zu erzwingen.

FROM golang 

RUN apt-get update && apt-get install -y ca-certificates git-core ssh 

ADD keys/my_key_rsa /root/.ssh/id_rsa 
RUN chmod 700 /root/.ssh/id_rsa 
RUN echo "Host github.com\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config 
RUN git config --global url.ssh://[email protected]/.insteadOf https://github.com/ 

ADD . /go/src/github.com/myaccount/myprivaterepo 

RUN go get github.com/myaccount/myprivaterepo 
RUN go install github.com/myaccount/myprivaterepo 
+2

Das Problem, das ich mit dieser Lösung habe, ist, dass es erfordert, dass mein privater ssh-Schlüssel in das Verzeichnis kopiert wird, in dem sich mein Quellcode befindet. Gibt es eine Möglichkeit, dies zu vermeiden? – nojo

6

go get versucht, https zu verwenden, ssh vollständig ignorierend.

Sie zu Setup ~/.netrc:

ADD priv/.netrc /root/.netrc 

Wo NETRC wie folgt aussieht:

machine github.com login github-username password github-password 

ref:

+0

danke für die Hilfe. sache ist - auf meinem Rechner (Mac) gehts funktioniert einwandfrei mit dem privaten Repo (Authentifizierung läuft reibungslos). Das Problem tritt nur bei dem Debian-Docker-Bild auf, an dem ich gerade arbeite. auch, bitte beachten Sie, dass die Fehler beobachtet werden, bevor gehen sogar passiert (ssh-keyscan-Ausgabe zeigt, gibt es Fehler, wie ich gepostet habe). – orcaman

+0

@orcaman 'lesen PEM privaten Schlüssel fertig: Typ ' könnte ein beschädigter privater Schlüssel sein. – OneOfOne

2

auf ~/.netrc Antwort des OneOfOne Ausarbeiten, das ist, was ich mit Jenkins auf Linux tue:

FROM golang:1.6 

ARG GITHUB_USER=$GITHUB_USER 
ARG GITHUB_PASS=$GITHUB_PASS 

# Copy local package files to the container's workspace. 
ADD . /go/src/github.com/my-org/my-project 
WORKDIR /go/src/github.com/my-org/my-project/ 

# Build application inside the container. 
RUN echo "machine github.com\n\tlogin $GITHUB_USER\n\tpassword $GITHUB_PASS" >> ~/.netrc && \ 
    go get github.com/tools/godep && \ 
    go get github.com/onsi/ginkgo/ginkgo && \ 
    godep restore && \ 
    ginkgo -r --randomizeAllSpecs --randomizeSuites --failOnPending && \ 
    godep go install && \ 
    rm -f ~/.netrc 

ENTRYPOINT /go/bin/my-project 

EXPOSE 8080 

Der Docker Build Befehl lautet:

docker build \ 
    --build-arg GITHUB_USER=xxxxx \ 
    --build-arg GITHUB_PASS=yyyyy \ 
    -t my-project . 

Die beiden ARG Richtlinien Karte --build-arg s so docker kann sie in der Dockerfile verwenden.

Die erste und letzte Zeile von RUN erstellen und entfernen Sie die ~/.netrc.

In Jenkins verwende ich die gleichen Kredits von git Pull im Build-Befehl.

Bei dieser Strategie wird das Kennwort während des Docker-Erstellungsprozesses nicht ausgegeben und nicht auf einer beliebigen Ebene des Docker-Images gespeichert. Beachten Sie auch, dass die Ergebnisse des Gingko-Tests während des Builds auf die Konsole gedruckt werden.

Verwandte Themen