Mam w Dockerfile
COPY . .
Chcę wykluczyć cały katalog, w moim przypadku, katalog_węzłów.
Coś takiego:
COPY [all but **/node_modules/**] .
Czy jest to możliwe dzięki Dockerowi?
Mam w Dockerfile
COPY . .
Chcę wykluczyć cały katalog, w moim przypadku, katalog_węzłów.
Coś takiego:
COPY [all but **/node_modules/**] .
Czy jest to możliwe dzięki Dockerowi?
Odpowiedzi:
Utwórz plik .dockerignore
w 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
/config/nginx/ /config/logstash/
znajduję to w bashu kontenerowym:ls config/ gunicorn logs logstash nginx
ls /config/
, czy próbowałeś dodać te ścieżki do swojego .dockerignore bez wiodącego /
?
node_modules
nie działa w podkatalogach.
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.
COPY failed: no source files were specified
gdy nie będzie żadnych plików zaczynających się od „nie”, ale nie „skinienie”.
src/
przejść do /var/www
i /conf/nginx.conf
przejść do /etc/nginx/conf.d/default.conf
. Możesz także skopiować wszystko, a RUN rm -r conf
później (także zachować drzewo źródłowe, jak było). Chciałbym usłyszeć, czy ktoś ma inną sugestię.
COPY [^node_modules]*
aby skopiować wszystkie pliki najwyższego poziomu.
W moim przypadku mój plik Docker zawierał krok instalacji, w wyniku którego powstał vendor
katalog (odpowiednik PHP node_modules
). Następnie COPY
ten katalog przechodzę do końcowego obrazu aplikacji. Dlatego nie mogę umieścić vendor
w 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ż vendor
katalog na hoście jest kopiowany do kontekstu Docker podczas procesu kompilacji, co wydłuża czas.
composer.lock
wcześniej composer install
. Bez pliku blokady inny zestaw zależności (folder dostawcy) może zostać zainstalowany podczas następnej kompilacji.
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)
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
.dockerignore
?