Clone private Git repo with dockerfile

Skopiowałem ten kod z tego, co wydaje się być różnymi działającymi plikami dokerowymi, oto mój:

FROM ubuntu

MAINTAINER Luke Crooks "[email protected]"

# Update aptitude with new repo
RUN apt-get update

# Install software 
RUN apt-get install -y git python-virtualenv

# Make ssh dir
RUN mkdir /root/.ssh/

# Copy over private key, and set permissions
ADD id_rsa /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
RUN chown -R root:root /root/.ssh

# Create known_hosts
RUN touch /root/.ssh/known_hosts

# Remove host checking
RUN echo "Host bitbucket.org\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config

# Clone the conf files into the docker container
RUN git clone [email protected]:Pumalo/docker-conf.git /home/docker-conf

To daje mi błąd

Step 10 : RUN git clone [email protected]:Pumalo/docker-conf.git /home/docker-conf
 ---> Running in 0d244d812a54
Cloning into '/home/docker-conf'...
Warning: Permanently added 'bitbucket.org,131.103.20.167' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
2014/04/30 16:07:28 The command [/bin/sh -c git clone [email protected]:Pumalo/docker-conf.git /home/docker-conf] returned a non-zero code: 128

Pierwszy raz używam plików dockerfiles, ale z tego co przeczytałem (i zaczerpnąłem z działających configów) Nie wiem dlaczego to nie działa.

Mój id_rsa znajduje się w tym samym folderze co mój plik dockerfile i jest kopią mojego lokalnego klucza, który może sklonować to repo bez problemu.

Edit:

W moim dockerfile mogę dodaj:

RUN cat /root/.ssh/id_rsa

I wypisuje prawidłowy klucz, więc wiem, że jest poprawnie skopiowany.

Ja też próbowałem zrobić to, co poradził noah i uciekł:

RUN echo "Host bitbucket.org\n\tIdentityFile /root/.ssh/id_rsa\n\tStrictHostKeyChecking no" >> /etc/ssh/ssh_config
To niestety też nie działa.
Author: Samuel Bolduc, 2014-04-30

5 answers

Mój klucz był chroniony hasłem, co powodowało problem, plik roboczy jest teraz wymieniony poniżej (dla pomocy przyszłych googlerów)

FROM ubuntu

MAINTAINER Luke Crooks "[email protected]"

# Update aptitude with new repo
RUN apt-get update

# Install software 
RUN apt-get install -y git
# Make ssh dir
RUN mkdir /root/.ssh/

# Copy over private key, and set permissions
ADD id_rsa /root/.ssh/id_rsa

# Create known_hosts
RUN touch /root/.ssh/known_hosts
# Add bitbuckets key
RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts

# Clone the conf files into the docker container
RUN git clone [email protected]:User/repo.git
 253
Author: crooksey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-17 14:22:31

Powinieneś utworzyć nowy zestaw kluczy SSH dla tego obrazu dokera, ponieważ prawdopodobnie nie chcesz osadzać tam własnego klucza prywatnego. Aby to działało, musisz dodać ten klucz do kluczy wdrażania w repozytorium git. Oto kompletny przepis:

  1. Wygeneruj klucze ssh za pomocą ssh-keygen -q -t rsa -N '' -f repo-key, które dadzą ci repo-key i repo-key.akta pubów.

  2. Dodaj repo-key.pub do kluczy wdrażania repozytorium.
    Na GitHub przejdź do [Twoje repozytorium] - > Ustawienia - > wdrażaj klucze

  3. Dodaj coś takiego do pliku Dockerfile:

    ADD repo-key /
    RUN \
      chmod 600 /repo-key && \  
      echo "IdentityFile /repo-key" >> /etc/ssh/ssh_config && \  
      echo -e "StrictHostKeyChecking no" >> /etc/ssh/ssh_config && \  
      // your git clone commands here...
    

Zauważ, że powyżej wyłącza StrictHostKeyChecking, więc nie potrzebujesz .ssh / known_hosts. Chociaż prawdopodobnie bardziej podoba mi się rozwiązanie z ssh-keyscan w jednej z powyższych odpowiedzi.

 79
Author: Marcin R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-28 23:27:16

Nie ma potrzeby bawić się konfiguracjami ssh. Użyj pliku konfiguracyjnego (Nie pliku Dockerfile), który zawiera zmienne środowiskowe, a skrypt powłoki zaktualizuje plik docker w czasie wykonywania. Zachowujesz tokeny z plików Dockerfiles i możesz klonować przez https (nie musisz generować ani przekazywać kluczy ssh).

Przejdź do Settings > personal Access Tokens

  • Wygeneruj osobisty token dostępu z włączonym zakresem repo.
  • Clone like this: git clone https://[email protected]/user-or-org/repo

Niektórzy komentatorzy zauważyli, że jeśli użyjesz udostępnionego pliku Dockerfile, może to ujawnić Twój klucz dostępu innym osobom w Twoim projekcie. Chociaż może to być problemem dla Twojego konkretnego przypadku użycia, oto kilka sposobów na poradzenie sobie z tym: {]}

  • Użyj skryptu powłoki, aby zaakceptować argumenty, które mogą zawierać twój klucz jako zmienną. Zamień zmienną w pliku Dokerowym na sed lub podobną, tzn. wywołanie skryptu na sh rundocker.sh MYTOKEN=foo, które zastąpiłoby na https://{{MY_TOKEN}}@github.com/user-or-org/repo. Uwaga że można też użyć pliku konfiguracyjnego (w .yml lub jakikolwiek inny format chcesz) zrobić to samo, ale ze zmiennymi środowiskowymi.
  • [12]} Utwórz użytkownika github (i wygeneruj token dostępu) tylko dla tego projektu
 59
Author: Calvin Froedge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-08 16:40:11

Dla repozytorium bitbucket Wygeneruj hasło aplikacji (Ustawienia Bitbucket -> Zarządzanie dostępem -> hasło aplikacji, patrz obrazek) z dostępem do odczytu repo i projektu.

menu użytkownika bitbucket

Następnie polecenie, którego powinieneś użyć to:

git clone https://username:[email protected]/reponame/projectname.git
 10
Author: Nomce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-09 21:32:50

Inną opcją jest użycie wielostopniowej kompilacji dokerów, aby upewnić się, że klucze SSH nie są zawarte w ostatecznym obrazie.

Jak opisano w moim poście możesz przygotować swój pośredni obraz z wymaganymi zależnościami do git clone, a następnie COPY wymagane pliki do ostatecznego obrazu.

Dodatkowo, jeśli mamy LABEL nasze warstwy pośrednie, możemy nawet usunąć je z maszyny po zakończeniu.

# Choose and name our temporary image.
FROM alpine as intermediate
# Add metadata identifying these images as our build containers (this will be useful later!)
LABEL stage=intermediate

# Take an SSH key as a build argument.
ARG SSH_PRIVATE_KEY

# Install dependencies required to git clone.
RUN apk update && \
    apk add --update git && \
    apk add --update openssh

# 1. Create the SSH directory.
# 2. Populate the private key file.
# 3. Set the required permissions.
# 4. Add github to our list of known hosts for ssh.
RUN mkdir -p /root/.ssh/ && \
    echo "$SSH_KEY" > /root/.ssh/id_rsa && \
    chmod -R 600 /root/.ssh/ && \
    ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts

# Clone a repository (my website in this case)
RUN git clone [email protected]:janakerman/janakerman.git

# Choose the base image for our final image
FROM alpine

# Copy across the files from our `intermediate` container
RUN mkdir files
COPY --from=intermediate /janakerman/README.md /files/README.md

Możemy wtedy zbudować:

MY_KEY=$(cat ~/.ssh/id_rsa)
docker build --build-arg SSH_KEY="$MY_KEY" --tag clone-example .

Udowodnij nasze SSH klucze zniknęły:

docker run -ti --rm clone-example cat /root/.ssh/id_rsa

Wyczyść pośrednie obrazy z maszyny do budowania:

docker rmi -f $(docker images -q --filter label=stage=intermediate)
 1
Author: jaker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-30 21:24:04