2015-11-12 10 views
8

Jaka jest najlepsza strategia klonowania prywatnego repozytorium Git do kontenera Docker przy użyciu pliku Docker? Za I przeciw?Strategie dokowania dla Git

Wiem, że mogę dodawać polecenia w Dockerfile, aby sklonować moje prywatne repozytorium do kontenera w doku. Chciałbym jednak wiedzieć, jakie różne podejścia wykorzystali ludzie w tej sprawie.

Nie jest to opisane w przewodniku po najlepszych procedurach Dockerfile.

Odpowiedz

4

Trzeba ogólnie dwa podejścia:

  • odwołujące się do skarbca, gdzie zdobycie tajnych danych niezbędnych do uzyskania dostępu, co trzeba umieścić w obrazie (tu klucze ssh, aby uzyskać dostęp do prywatnych repo)

Aktualizacja 2018: patrz "How to keep your container secrets secure", który obejmuje:

  • wierzchowce Wykorzystanie objętości do przekazać tajemnice do pojemnika w czasie wykonywania
  • Mają plan tajemnic obracających
  • Upewnij się, że tajemnice są szyfrowane

  • lub technikę zgniatanie (niezalecane, patrz komentarz)

Drugie podejście opisano w "Pulling Git into a Docker image without leaving SSH keys behind"

  • Dodaj klucz prywatny do Dockerfile
  • Dodaj go do ssh-agent
  • Uruchom polecenia, które wymagają uwierzytelniania SSH
  • Usuń klucz prywatny

Dockerfile:

ADD ~/.ssh/mykey /tmp/ 
RUN ssh-agent /tmp 
# RUN bundle install or similar command 
RUN rm /tmp/mykey 

Zbudujmy obraz teraz:

$ docker build -t original . 
  • squash warstwy:

    docker save original | sudo docker-squash -t squashed | docker load 
    
+0

Dodawanie klucza prywatnego będzie prawdopodobnie dodać warstwę do znaczenia Dockerfile że są tam przechowywane i mogą być odzyskane przez kogoś wystarczająco inteligentnego, nawet jeśli "usunięto" później: – alexvicegrab

+1

@alexvicegrab Good point. Ponad dwa lata później zredagowałem odpowiedź, aby jaśniej było, aby pierwsze podejście było lepsze. – VonC

+0

Dziękuję VonC! – alexvicegrab

1

będę dzielić co znalazłem do tej pory.

Istnieją różne strategie, aby uzyskać kod źródłowy Git w kompilacji Docker. Wiele z nich ma różne sposoby interakcji z mechanizmami buforowania Docker i może być mniej lub bardziej adekwatnie dopasowane do twojego projektu i sposobu, w jaki zamierzasz używać Dockera.

RUN git clone

Jeśli jesteś podobny do mnie, jest to podejście, które pierwsze przychodzi na myśl, gdy widzisz polecenia dostępne dla Ciebie w Dockerfile. Problem polega na tym, że może on wchodzić w interakcje na kilka nieintucynujących sposobów dzięki mechanizmom buforowania budowania Dockera. Jeśli na przykład wprowadzisz aktualizację do repozytorium git, a następnie ponownie uruchomisz kompilację dockera, która ma polecenie RUN git clone, możesz otrzymać nowe zatwierdzenia lub nie, w zależności od tego, czy poprzednie komendy Dockerfile zostały unieważnione. pamięć podręczną.

Jednym ze sposobów obejścia tego problemu jest użycie budowania dockera --no-cache, ale jeśli są jakieś czasochłonne polecenia poprzedzające klon, będą musiały zostać uruchomione ponownie.

Inną kwestią jest to, że ty (lub ktoś, do kogo rozprowadziłeś swój plik Dockerfile) może nieoczekiwanie wrócić do uszkodzonej kompilacji później, gdy uaktualnione repozytorium git zostanie zaktualizowane.

Podejście dwa ptaki, jeden kamień do tego czasu nadal używa RUN git clone jest, aby umieścić go na jednej line1 z konkretnym kasie rewizyjnej, np:

RUN git clone https://github.com/example/example.git && cd example && git checkout 0123abcdef 

Następnie aktualizowania rewizji, aby sprawdzić w pliku Dockerfile unieważni pamięć podręczną w tej linii i spowoduje uruchomienie klonowania/kasy.

Jedną z możliwych wad tego podejścia jest to, że musisz mieć zainstalowany git w swoim kontenerze.

RUN curl lub dodać tag/popełnić archiwum ze URL

ten sposób nie musisz mieć git zainstalowany w środowisku pojemnika, i może skorzystać z bycia widocznego gdy bufor złamie (czyli jeśli tag/poprawka jest częścią adresu URL, zmiana adresu URL spowoduje utratę pamięci podręcznej). Zauważ, że jeśli użyjesz polecenia Dockerfile ADD do skopiowania ze zdalnego adresu URL, plik zostanie pobrany przy każdym uruchomieniu kompilacji, a nagłówek Last-Modified HTTP będzie również używany do unieważniania pamięci podręcznej.

Możesz zobaczyć to podejście stosowane w golang Dockerfile.

Git submodules wewnątrz Dockerfile repozytorium

Jeśli trzymać Dockerfile i Docker budować w oddzielnym repozytorium z kodem źródłowym, lub swojej budowie Docker wymaga wielu repozytoriów źródłowych za pomocą submodules git (lub poddrzewa GIT) w to repozytorium może być prawidłowym sposobem na uzyskanie repozytoriów źródłowych w kontekście kompilacji. Pozwala to uniknąć pewnych problemów z buforowaniem Dockera i aktualizacją na wyższym poziomie, ponieważ blokujesz wersję wstępną w specyfikacji modułu częściowego/poddrzewa. Ich aktualizacja przerwie pamięć podręczną Docker, zmieniając kontekst kompilacji.

Należy zauważyć, że to tylko pobiera pliki do kontekstu kompilacji Docker, nadal trzeba użyć poleceń ADD w pliku Dockerfile, aby skopiować te ścieżki do miejsca, w którym oczekuje się ich w kontenerze.

Można zobaczyć to podejście stosowane w here

Dockerfile wewnątrz repozytorium git

Tutaj, po prostu mieć swój Dockerfile w tym samym repozytorium git obok kodu chcesz zbudować/test/wdrożyć , więc automatycznie zostaje wysłany jako część kontekstu kompilacji, dzięki czemu możesz np DODAJ ./projekt, aby skopiować kontekst do kontenera. Zaletą tego jest to, że możesz testować zmiany bez konieczności potencjalnego zatwierdzania/wypychania ich w celu przetestowania ich w wersji testowej; wadą jest to, że za każdym razem, gdy modyfikujesz jakiekolwiek pliki w twoim katalogu roboczym, unieważni to pamięć podręczną za pomocą polecenia ADD. Wysyłanie kontekstu kompilacji dla dużego katalogu źródłowego/danych również może być czasochłonne. Więc jeśli użyjesz tego podejścia, możesz również rozważyć użycie .dockerignore file, w tym robić rzeczy takie jak ignorowanie wszystkiego w .gitignore i ewentualnie w katalogu .git.

mapowanie Volume

Jeśli używasz Döcker skonfigurować środowisko dev/test, który chcesz podzielić się spośród szerokiej gamy repo źródłowych na komputerze hosta, mounting a host directory as a data volume może być realną strategią. Daje to możliwość określenia katalogów, które chcesz uwzględnić w czasie pracy dokowania, i unika obaw związanych z buforowaniem budowania dockera, ale nic z tego nie zostanie udostępnione innym użytkownikom pliku Dockerfile lub obrazu kontenera.

-

Referencje: