2014-10-02 24 views
7

Sto provando ad eseguire un container che esporrà un servizio golang da un pacchetto che ho su un repository privato GitHub.Docker: vai da un repository privato GitHub

Dato che lavoro con GCE, la mia immagine di partenza è google/debian: wheezy.

Dopo aver installato tutte le dipendenze e gli strumenti necessari, io sono in esecuzione

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

in cui il pacchetto è un repo privata.

Ho aggiunto le mie chiavi SSH GitHub per permettere la clonazione dal repo privato al file finestra mobile:

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

Eppure, sto ottenendo un errore durante l'andare a prendere processo quando andare cercato di clonare il repo :

# 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 

per il debug del problema, dal Dockerfile, sto facendo funzionare:

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

E questo mi dice che ci sono alcuni problemi. Sembra che la convalida della chiave privata sia OK ma qualcosa di strano sta andando nella chiave pubblica. Questo è il risultato completo della ssh-KeyScan:

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). 

Ho provato chmod 600 e chmod 700 sui tasti priv/pubbliche, questo non ha aiutato.

Eventuali indizi? Qualcuno ha avuto successo nel correre a prendere i recuperi dai repository privati ​​su debian dalla finestra mobile?

+0

Stai eseguendo i comandi 'go get' come root? Dovresti usare 'go get' con il tuo account utente e memorizzare la tua chiave in'/home/yourAccount'. – VonC

+0

Verifichereste le autorizzazioni e le preferenze condivise come in http://stackoverflow.com/a/19798820/6309 help? – VonC

risposta

5

L'ho capito dopo un po 'di hacking. Non è una soluzione ideale in quanto implica l'installazione di SSH e la creazione di una chiave privata nel contenitore. Questo esempio è basato sul numero ufficiale Docker golang image (Debian Wheezy):

La differenza principale dell'esempio è che è necessario un comando git config per forzare ssh anziché https predefinito.

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

Il problema che ho con questa soluzione è che richiede la mia chiave ssh privata per essere copiata nella directory copiata nella directory in cui si trova il mio codice sorgente. c'è un modo per evitarlo? – nojo

6

go get sta tentando di utilizzare https, ignorando completamente ssh.

Si dovrà configurazione ~/.netrc:

ADD priv/.netrc /root/.netrc 

Dove netrc assomiglia:

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

ref:

+0

grazie per l'aiuto. cosa è - sulla mia macchina (Mac) andare a lavorare perfettamente bene con il repository privato (l'autenticazione procede senza intoppi). il problema si verifica solo sull'immagine della finestra mobile debian su cui sto lavorando. Inoltre, si prega di notare che gli errori sono stati osservati prima che si verifichi il verificarsi (l'output di ssh-keyscan mostra che ci sono errori come ho postato). – orcaman

+0

@orcaman 'leggi la chiave privata PEM fatta: digitare ' potrebbe essere una chiave privata corrotta. – OneOfOne

2

Elaborando ~/.netrc risposta di OneOfOne, questo è quello che sto facendo con Jenkins su linux:

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 

Il comando finestra mobile build è:

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

I due ARG direttive map --build-arg s così docker può usarli all'interno del Dockerfile.

La prima e l'ultima riga di RUN creano e rimuovono ~/.netrc.

In Jenkins, io uso gli stessi cred da git pull nel comando build.

In questa strategia, la password non viene echeggiata durante il processo di creazione della finestra mobile e non viene salvata su alcun livello dell'immagine della finestra mobile. Si noti inoltre che i risultati del test gingko vengono stampati sulla console durante la compilazione.

Problemi correlati