2014-10-02 16 views
7

Tôi đang cố gắng chạy một container sẽ trưng ra một dịch vụ golang từ một gói mà tôi có trên một repo GitHub riêng.Docker: đi lấy từ một GitHub repo tư nhân

Vì tôi đang làm việc với GCE, hình ảnh khởi động của tôi là google/debian: wheezy.

Sau khi cài đặt tất cả các dependancies và công cụ cần thiết, tôi đang chạy

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

nơi gói là một repo tin.

Tôi đã thêm các phím SSH GitHub của tôi để cho phép nhân bản từ repo tin vào file Docker:

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

Tuy nhiên, tôi nhận được một lỗi trong quá đi lấy quá trình khi đi cố gắng sao chép các 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 

Để gỡ rối vấn đề, từ Dockerfile, tôi đang chạy:

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

Và điều này cho tôi biết có một số vấn đề. Có vẻ như việc xác nhận khóa cá nhân là OK nhưng có điều gì đó kỳ lạ đang xảy ra trên khóa công cộng. Đây là kết quả ssh-keyscan hoàn chỉnh:

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

Tôi đã thử chmod 600 và chmod 700 trên khóa riêng/khóa công khai, điều này không hữu ích.

Bất kỳ manh mối nào? Có ai thành công trong việc chạy đi lấy lấy những thứ đó từ các repos riêng trên debian từ docker không?

+0

Bạn có đang chạy lệnh 'go get' làm gốc không? Bạn nên sử dụng 'go get' với tài khoản người dùng của bạn và lưu khóa của bạn trong'/home/yourAccount'. – VonC

+0

Có kiểm tra các quyền và tùy chọn được chia sẻ như trong http://stackoverflow.com/a/19798820/6309 trợ giúp không? – VonC

Trả lời

5

Tôi đã tìm ra điều này sau một chút hack. Không phải là một giải pháp lý tưởng vì nó liên quan đến việc cài đặt SSH, cộng với xây dựng một khóa riêng vào vùng chứa. Ví dụ này dựa trên chính thức Docker golang image (Debian Wheezy):

Sự khác biệt chính với ví dụ của bạn là bạn cần lệnh git config để ép ssh thay vì https mặc định.

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

Vấn đề mà tôi có với giải pháp này là nó yêu cầu khóa ssh riêng của tôi được sao chép vào trong thư mục nơi mã nguồn của tôi được đặt. Có cách nào để tránh điều này không? – nojo

6

go get đang cố sử dụng https, bỏ qua hoàn toàn ssh.

Bạn sẽ phải thiết lập ~/.netrc:

ADD priv/.netrc /root/.netrc 

đâu NETRC trông giống như:

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

ref:

+0

cảm ơn sự giúp đỡ. điều là - trên máy tính của tôi (Mac) đi làm việc hoàn toàn tốt đẹp với repo tư nhân (xác thực tiến hành thuận lợi). vấn đề chỉ xảy ra trên hình ảnh docker debian mà tôi đang làm việc. cũng, xin lưu ý rằng các lỗi được quan sát trước khi đi thậm chí xảy ra (ssh-keyscan đầu ra cho thấy có lỗi như tôi đã đăng). – orcaman

+0

@orcaman 'đọc khóa riêng PEM được thực hiện: loại 'có thể là khóa riêng bị hỏng. – OneOfOne

2

Xây dựng trên ~/.netrc câu trả lời OneOfOne, đây là những gì tôi đang làm với Jenkins trên 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 

Các Docker build lệnh là:

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

Hai ARG chỉ thị bản đồ --build-arg s để docker có thể sử dụng chúng bên trong Dockerfile.

Dòng đầu tiên và cuối cùng của RUN tạo và xóa ~/.netrc.

Trong Jenkins, tôi sử dụng cùng một số tiền từ git pull trong lệnh xây dựng.

Trong chiến lược này, mật khẩu không được lặp lại trong quá trình xây dựng docker và không được lưu trên bất kỳ lớp nào của hình ảnh docker của bạn. Cũng lưu ý rằng các kết quả kiểm tra gingko được in ra bàn điều khiển trong quá trình xây dựng.

Các vấn đề liên quan