Skopiowałem ten kod z różnych działających dokerów, tutaj jest 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
Po raz pierwszy używam plików docker, ale z tego, co przeczytałem (i wziąłem z działających konfiguracji), nie rozumiem, dlaczego to nie działa.
Mój id_rsa znajduje się w tym samym folderze co plik dokera i jest kopią mojego klucza lokalnego, który bez problemu może sklonować to repo.
Edytować:
W moim pliku dokera mogę dodać:
RUN cat /root/.ssh/id_rsa
I drukuje prawidłowy klucz, więc wiem, że został poprawnie skopiowany.
Próbowałem też postępować zgodnie z zaleceniami Noego i pobiegłem:
RUN echo "Host bitbucket.org\n\tIdentityFile /root/.ssh/id_rsa\n\tStrictHostKeyChecking no" >> /etc/ssh/ssh_config
To też niestety nie działa.
ssh-keyscan
domyślny limit czasu wynosi 5 sekund, który często przekraczał bitbucket.ssh-keyscan
nawet nie zgłosi błędu. Więc lepiej biegnij,RUN ssh-keyscan -T 60 bitbucket.org >> /root/.ssh/known_hosts
żeby być bezpiecznym.ssh-keyscan
jest problemem? Rozumiem, że po prostu wyciągnie klucz publiczny z Github / Bitbucket. Jaką alternatywę można zastosować, aby nie skończyła się warstwą?known_hosts
pliku znajdują się w sshd (8) . Ludzie opowiadają się za przypadkowymi rzeczami, kiedy brzmią wystarczająco niepokojąco.Powinieneś utworzyć nowy zestaw kluczy SSH dla tego obrazu Docker, ponieważ prawdopodobnie nie chcesz osadzać tam własnego klucza prywatnego. Aby to zadziałało, musisz dodać ten klucz do kluczy wdrażania w repozytorium git. Oto kompletny przepis:
Wygeneruj klucze ssh, za pomocą
ssh-keygen -q -t rsa -N '' -f repo-key
których otrzymasz pliki repo-key i repo-key.pub.Dodaj repo-key.pub do kluczy wdrażania repozytorium.
Na GitHub przejdź do [twoje repozytorium] -> Ustawienia -> Wdróż klucze
Dodaj coś takiego do pliku Docker:
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.
źródło
fatal: Could not read from remote repository.
Nie ma potrzeby bawienia się konfiguracjami ssh. Użyj pliku konfiguracyjnego (nie Dockerfile), który zawiera zmienne środowiskowe, a skrypt powłoki zaktualizuje plik dokera w czasie wykonywania. Trzymasz tokeny poza Dockerfiles i możesz klonować przez https (nie musisz generować ani przekazywać kluczy ssh).
Przejdź do Ustawienia> Osobiste tokeny dostępu
repo
włączonym zakresem.git clone https://[email protected]/user-or-org/repo
Niektórzy komentatorzy zauważyli, że jeśli użyjesz udostępnionego pliku Docker, może to ujawnić Twój klucz dostępu innym osobom w twoim projekcie. Chociaż może to dotyczyć konkretnego przypadku użycia, może to dotyczyć następujących sposobów: Oto kilka sposobów rozwiązania tego problemu:
sed
podobnym lub podobnym, tj. Wywołanie skryptu,sh rundocker.sh MYTOKEN=foo
który by go zastąpiłhttps://{{MY_TOKEN}}@github.com/user-or-org/repo
. Pamiętaj, że możesz również użyć pliku konfiguracyjnego (w formacie .yml lub dowolnym innym formacie), aby zrobić to samo, ale ze zmiennymi środowiskowymi.źródło
Settings > Applications
?Inną opcją jest użycie wieloetapowej kompilacji dokera, aby upewnić się, że klucze SSH nie są uwzględnione w ostatecznym obrazie.
Jak opisano w moim poście , możesz przygotować swój obraz pośredni z wymaganymi zależnościami do klonowania, 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.Następnie możemy zbudować:
Udowodnij, że klucze SSH zniknęły:
Wyczyść obrazy pośrednie z maszyny kompilacji:
źródło
RUN
aby nie pozostawić klucza na poprzedniej warstwie obrazu. Jako doker1.13
można użyć--squash
eksperymentalnego argumentu, który usunąłby klucz SSH również w końcowych warstwach obrazu.W przypadku repozytorium bitbucket wygeneruj hasło aplikacji (ustawienia Bitbucket -> Zarządzanie dostępem -> Hasło aplikacji, zobacz obraz) z dostępem do odczytu repozytorium i projektu.
Następnie należy użyć polecenia:
źródło
--recursive
nie działałem . Musiałem wstawićgit clone
dla każdego podmodułu, co jest w porządku, ale byłoby świetnie, gdyby działało rekurencyjnie.Często nie chcesz wykonywać
git clone
prywatnego repozytorium z kompilacji dokera. Wykonanie tam klonowania polega na umieszczeniu prywatnych poświadczeń ssh wewnątrz obrazu, gdzie mogą je później wyodrębnić dowolne osoby mające dostęp do twojego obrazu.Zamiast tego powszechną praktyką jest klonowanie repozytorium git spoza dokera w wybranym narzędziu CI i po prostu
COPY
pliki do obrazu. Ma to drugą zaletę: buforowanie dokerów. Buforowanie dokera sprawdza uruchamiane polecenie, zawarte w nim zmienne środowiskowe, pliki wejściowe itp. Jeśli są identyczne z poprzednią kompilacją z tego samego kroku nadrzędnego, ponownie wykorzystuje poprzednią pamięć podręczną. Wgit clone
przypadku polecenia samo polecenie jest identyczne, więc doker ponownie użyje pamięci podręcznej, nawet jeśli zmieni się zewnętrzne repozytorium git. JednakCOPY
polecenie sprawdzi pliki w kontekście kompilacji i zobaczy, czy są one identyczne lub zostały zaktualizowane, i użyje pamięci podręcznej tylko wtedy, gdy jest to właściwe.Jeśli zamierzasz dodać poświadczenia do swojej kompilacji, rozważ zrobienie tego z kompilacją wieloetapową i umieszczaj te poświadczenia tylko na wczesnym etapie, który nigdy nie jest oznaczany i wypychany poza host kompilacji. Wynik wygląda następująco:
Ostatnio BuildKit testuje niektóre eksperymentalne funkcje, które pozwalają przekazać klucz ssh jako mount, który nigdy nie jest zapisywany na obrazie:
Możesz to zbudować za pomocą:
Należy pamiętać, że nadal wymaga to, aby klucz ssh nie był chroniony hasłem, ale można przynajmniej uruchomić kompilację w jednym etapie, usuwając polecenie KOPIUJ i unikając poświadczenia ssh, które nigdy nie będzie częścią obrazu.
BuildKit dodał także funkcję tylko dla ssh, która pozwala nadal mieć chronione hasłem klucze ssh, wynik wygląda następująco:
Możesz to zbudować za pomocą:
Ponownie jest on wstrzykiwany do kompilacji bez zapisywania go w warstwie obrazu, co eliminuje ryzyko przypadkowego wycieku poświadczenia.
Aby zmusić okno dokowane do uruchomienia
git clone
nawet wtedy, gdy wiersze zostały uprzednio zbuforowane, możesz wstrzyknąć ARG kompilacji, który zmienia się przy każdej kompilacji, aby przerwać bufor. To wygląda jak:Następnie wstrzykujesz ten zmieniający się argument w poleceniu kompilacji dokera:
źródło
Powyższe rozwiązania nie działały w przypadku bitbucket. Pomyślałem, że to załatwia sprawę:
źródło