В Dockerfile у меня есть
COPY . .
Я хочу исключить весь каталог, в моем случае, каталог node_modules.
Что-то вроде этого:
COPY [all but **/node_modules/**] .
Это возможно с Docker?
В Dockerfile у меня есть
COPY . .
Я хочу исключить весь каталог, в моем случае, каталог node_modules.
Что-то вроде этого:
COPY [all but **/node_modules/**] .
Это возможно с Docker?
Ответы:
Создайте файл .dockerignore
в каталоге контекста сборки Docker (так что в этом случае, скорее всего, это каталог, являющийся родительским для node_modules) с одной строкой в нем:
**/node_modules
хотя ты наверное просто хочешь
node_modules
Информация о dockerignore: https://docs.docker.com/engine/reference/builder/#dockerignore-file
/config/nginx/ /config/logstash/
я нахожу это в контейнере bash:ls config/ gunicorn logs logstash nginx
ls /config/
, вы пытались добавить эти пути в ваш .dockerignore без ведущего /
?
node_modules
не работает в подкаталогах.
Для тех, кто не может использовать файл .dockerignore (например, если вам нужен файл в одной копии, но не в другой):
Да, но вам нужно несколько инструкций COPY. В частности, вам нужна копия для каждой буквы в имени файла, которое вы хотите исключить.
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'
Продолжая, пока у вас не будет полного имени файла или просто префикса, в котором вы уверены, что других файлов не будет.
COPY failed: no source files were specified
когда нет файлов, начинающихся с «нет», но не с «кивок».
src/
пойти /var/www
и /conf/nginx.conf
перейти к /etc/nginx/conf.d/default.conf
. Кроме того, вы можете скопировать все, и RUN rm -r conf
позже (тоже сохранить исходное дерево, как было). Я хотел бы услышать, если у кого-то есть другое предложение.
COPY [^node_modules]*
чтобы скопировать все файлы верхнего уровня.
В моем случае мой Dockerfile содержал шаг установки, на котором создавался vendor
каталог (эквивалент PHP node_modules
). Я тогда COPY
этот каталог к окончательному изображению приложения. Поэтому я не мог положить vendor
в свой .dockerignore
. Мое решение было просто удалить каталог перед выполнением composer install
(эквивалент 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 .
Это решение работает и не раздувает окончательный образ, но оно не идеально, потому что vendor
каталог на хосте копируется в контекст Docker во время процесса сборки, что добавляет время.
composer.lock
прежде чем composer install
. Без файла блокировки при следующей сборке может быть установлен другой набор зависимостей (папка вендора).
Добавление .dockerignore работает для меня. Еще один момент. Те, кто пробует это решение в Windows , Windows не позволят вам создать файл .dockerignore (так как он по умолчанию не позволяет создавать файл, начиная с.)
Чтобы создать такой файл, начиная с. на ОС Windows , включают в себя окончание точка также, как: .dockerignore.
и нажмите клавишу ВВОД (если вы включили просматривать варианты расширения из вариантов папки)
Исключение node_modules из текущего каталога
node_modules
Исключая node_modules в любых непосредственных подкаталогах
*/node_modules
.dockerignore
?