KOPIUJ za pomocą okna dokowanego, ale z wyłączeniem

Odpowiedzi:

377

Utwórz plik .dockerignorew katalogu kontekstowym kompilacji dokera (więc w tym przypadku najprawdopodobniej katalog, który jest rodzicem modułów_węzła) z jednym wierszem:

**/node_modules

chociaż prawdopodobnie po prostu chcesz:

node_modules

Informacje o dockerignore: https://docs.docker.com/engine/reference/builder/#dockerignore-file

vith
źródło
5
dzięki, więc „KOPIUJ”. Wydaje mi się, że polecenie nie musi się zmieniać
Alexander Mills
Nie bardzo: /config/nginx/ /config/logstash/znajduję to w bashu kontenerowym:ls config/ gunicorn logs logstash nginx
SalahAdDin
3
@SalahAdDin z tego samego powodu, dla którego nie napisałeś ls /config/, czy próbowałeś dodać te ścieżki do swojego .dockerignore bez wiodącego /?
Pablo
8
Po prostu node_modulesnie działa w podkatalogach.
rustyx
5
To tak naprawdę nie rozwiązuje problemu, jeśli chcesz go KOPIOWAĆ, ale po prostu nie w tej warstwie ...
Wes
33

Dla tych, którzy nie mogą korzystać z pliku .dockerignore (np. Jeśli potrzebujesz pliku w jednym KOPII, ale nie w innym):

Tak, ale potrzebujesz wielu instrukcji KOPIOWANIA. W szczególności potrzebujesz KOPII dla każdej litery w nazwie pliku, którą chcesz wykluczyć.

COPY [^n]*    # All files that don't start with 'n'
COPY n[^o]*   # All files that start with 'n', but not 'no'
COPY no[^d]*  # All files that start with 'no', but not 'nod'

Kontynuuj, dopóki nie otrzymasz pełnej nazwy pliku lub tylko prefiksu, co do którego masz pewność, że nie będzie żadnych innych plików.

Alex
źródło
1
Nie zadziała, bo dostaniesz, COPY failed: no source files were specifiedgdy nie będzie żadnych plików zaczynających się od „nie”, ale nie „skinienie”.
mheck
1
Alternatywnie, możesz użyć dwóch różnych podkatalogów (dla różnych celów kopiowania), aby np. W mojej konfiguracji nginx musiałbym src/przejść do /var/wwwi /conf/nginx.confprzejść do /etc/nginx/conf.d/default.conf. Możesz także skopiować wszystko, a RUN rm -r confpóźniej (także zachować drzewo źródłowe, jak było). Chciałbym usłyszeć, czy ktoś ma inną sugestię.
Yuval
1
Jakie byłoby rozwiązanie dla określonych typów plików lub końców plików, jeśli zrobiłbym to w ten sposób?
Lea Reimann
Jedynym minusem tego podejścia jest spłaszczona struktura folderów
Islam,
Jeśli masz tylko kilka katalogów do skopiowania (powiedz tylko „/ app” lub „/ src”). Prostszym sposobem byłoby skopiowanie katalogów osobno (aby zachować ich strukturę), a wtedy wystarczy tylko jeden, COPY [^node_modules]*aby skopiować wszystkie pliki najwyższego poziomu.
smdufb
9

W moim przypadku mój plik Docker zawierał krok instalacji, w wyniku którego powstał vendorkatalog (odpowiednik PHP node_modules). Następnie COPYten katalog przechodzę do końcowego obrazu aplikacji. Dlatego nie mogę umieścić vendorw moim .dockerignore. Moim rozwiązaniem było po prostu usunięcie katalogu przed wykonaniem composer install(odpowiednik PHP npm install).

FROM composer AS composer
WORKDIR /app
COPY . .
RUN rm -rf vendor \
    && composer install 

FROM richarvey/nginx-php-fpm
WORKDIR /var/www/html
COPY --from=composer /app .

To rozwiązanie działa i nie powoduje rozdęcia końcowego obrazu, ale nie jest idealne, ponieważ vendorkatalog na hoście jest kopiowany do kontekstu Docker podczas procesu kompilacji, co wydłuża czas.

Cameron Hudson
źródło
3
Pamiętaj, dlaczego musisz usunąć composer.lockwcześniej composer install. Bez pliku blokady inny zestaw zależności (folder dostawcy) może zostać zainstalowany podczas następnej kompilacji.
Lacek
1
@ Lacek: Masz rację. Nauczyłem się lepiej, odkąd to opublikowałem.
Cameron Hudson
1
@CameronHudson może zaktualizować oryginalną odpowiedź, zanim ludzie skopiują / wkleją tę złą praktykę.
Robin van Baalen
2

Dodanie .dockerignore działa dla mnie. Dodatkowa uwaga Ci, którzy wypróbowują to rozwiązanie w systemie Windows , Windows nie pozwolą ci utworzyć pliku .dockerignore (ponieważ domyślnie nie pozwala na tworzenie pliku od.)

Aby utworzyć taki plik, zaczynając od. w systemie Windows , jak również zakończenie kropka, jak: .dockerignore.i naciśnij Enter (o ile masz włączoną opcje widoku rozszerzenie z opcji folderów)

Paras Patidar
źródło
6
Możesz utworzyć plik w systemie Windows, który zaczyna się od kropki, kończąc go również kropką.
Jim Pedid
0

Z wyłączeniem modułów node_modu z bieżącego katalogu

node_modules

Z wyjątkiem modułów node_modules w jakichkolwiek bezpośrednich podkatalogach

*/node_modules

Oto oficjalne dokumenty

kta
źródło