Docker śledzi łącze symboliczne poza kontekstem

88

Kolejne pytanie dotyczące linku symbolicznego Dockera. Mam kilka plików, które chcę skopiować do wszystkich moich kompilacji Dockera. Moja struktura katalogu to:

parent_dir
    - common_files
        - file.txt
    - dir1
        - Dockerfile  
        - symlink -> ../common_files

W powyższym przykładzie chcę, aby plik.txt został skopiowany, gdy dokonuję kompilację w dir1. Ale nie chcę utrzymywać wielu kopii pliku.txt. Za pomocą tego linku, od wersji Dockera 0.10 , kompilacja Dockera musi

Postępuj zgodnie z linkami symbolicznymi w katalogu głównym kontenera, aby uzyskać instrukcje kompilacji DODAJ.

Ale nie otrzymuję takiego pliku ani katalogu, gdy kompiluję z jednym z tych wierszy w moim pliku Dockerfile:

ADD symlink /path/dirname lub ADD symlink/file.txt /path/file.txt

opcja montowania NIE rozwiąże tego za mnie (cross platform ...). Próbowałem tar -czh . | docker build -tbez powodzenia.

Czy istnieje sposób, aby Docker podążał za dowiązaniem symbolicznym i kopiował plik common_files / file.txt do zbudowanego kontenera?

Ravi
źródło

Odpowiedzi:

68

Nie jest to możliwe i nie zostanie wdrożone. Zapraszam do dyskusji na temat numeru 1676 na githubie :

Nie pozwalamy na to, ponieważ nie jest to powtarzalne. Dowiązanie symboliczne na twoim komputerze nie jest tym samym, co mój komputer, a ten sam plik Dockerfile dałby dwa różne wyniki. Również posiadanie dowiązań symbolicznych do / etc / paasswd powodowałoby problemy, ponieważ łączyłoby to pliki hosta, a nie pliki lokalne.

0x7d7b
źródło
Dziękuję Ci. Tak, zauważyłem to łącze już wcześniej, ale pomyślałem, że dotyczy to znacznie starszej wersji dockera (0.6.1). Dziennik zmian w wersji 0.10 wspomina o tym, że jest to możliwe github.com/docker/docker/blob/master/ ...
Ravi
Również jeśli "katalog_nadrzędny" jest wyewidencjonowany na jakimkolwiek komputerze i jeśli dowiązanie symboliczne ma ścieżkę względną do "common_files", będzie to powtarzalne.
Ravi
2
Twój cytat Follow symlinks inside container's root for ADD build instructions.oznacza, że wewnątrz kontenera są śledzone dowiązania symboliczne. Nie w katalogu kontekstu kompilacji. W ADD file.txt /dir/file.txtkatalogu dirmoże znajdować się dowiązanie symboliczne. Argumenty, które zacytowałem w mojej odpowiedzi, są nadal aktualne, a linki symboliczne nadal nie są używane w najnowszej wersji. Możesz napotkać problemy (dotyczące powtarzalności) podczas przechowywania linków symbolicznych w systemach kontroli wersji, takich jak git . Dlatego proszę odnieść się do tego pytania .
0x7d7b
1
Rozumiem, co myślisz o dowiązaniach symbolicznych w git. Ale dowiązania symboliczne nie muszą jednak wchodzić do gita. Prosty skrypt instalacyjny może przygotować lokalne środowisko env tworząc dowiązania symboliczne. Dla mnie koszt przechowywania „n” kopii udostępnionego pliku wydaje się zbyt wysoki z punktu widzenia konserwacji. Może będę musiał podawać to z apache. Dziękuję Ci.
Ravi
18
Jaka szkoda, kiedy widzę, że nie podążam za logiką i to mnie gryzie. Git doskonale radzi sobie z symblinkami i spodziewam się również, że kompilacje będą działać na wszystkich maszynach i środowiskach, w których sprawdzane jest repozytorium źródeł ..?!
Gregor
9

Jedną z możliwości jest uruchomienie kompilacji w katalogu nadrzędnym z:

$ docker build [tags...] -f dir1/Dockerfile .

(Lub równoważnie w katalogu podrzędnym)

$ docker build  [tags...] -f Dockerfile ..

Plik Dockerfile będzie musiał zostać skonfigurowany do kopiowania / dodawania z odpowiednimi ścieżkami. W zależności od konfiguracji możesz chcieć, aby .dockerignorerodzic pomijał rzeczy, których nie chcesz być umieszczany w kontekście.

shaunc
źródło
2

zamiast używać linków simlink można rozwiązać problem administracyjnie, po prostu przenosząc pliki z site_available do sites_enabled zamiast kopiować lub tworzyć simlinks

więc twoja konfiguracja witryny będzie w jednej kopii tylko w folderze site_available, jeśli został zatrzymany lub coś takiego, lub w sites_enabled, jeśli powinien zostać użyty

Ilya Kolesnikov
źródło
1

Wiem, że łamie to przenośność kompilacji dockera, ale możesz użyć twardych linków zamiast symbolicznych:

ln /some/file ./hardlink
Eugene
źródło
3
Aby było jasne, działa to w przypadku plików, a nie katalogów.
GDorn