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. 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
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:
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.-
Dodaj repo-key.pub do kluczy wdrażania repozytorium.
Na GitHub przejdź do [Twoje repozytorium] - > Ustawienia - > wdrażaj klucze -
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.
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 nash rundocker.sh MYTOKEN=foo
, które zastąpiłoby nahttps://{{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
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.
Następnie polecenie, którego powinieneś użyć to:
git clone https://username:[email protected]/reponame/projectname.git
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)
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