COPY с докере, но с исключением
В файле Docker у меня есть
COPY . .
Я хочу исключить целую директорию, в моем случае, каталог node_modules.
Что-то вроде этого:
COPY [all but **/node_modules/**] .
Возможно ли это с помощью Docker?
Ответы
Ответ 1
Создайте файл .dockerignore
в каталоге контекста сборки .dockerignore
(так что в этом случае, скорее всего, это каталог, который является родительским для node_modules) с одной строкой в нем:
**/node_modules
хотя ты наверное просто хочешь
node_modules
Информация о dockerignore: https://docs.docker.com/engine/reference/builder/#dockerignore-file
Ответ 2
Для тех, кто не может использовать файл .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'
Продолжайте, пока у вас не будет полного имени файла или только того префикса, в котором вы уверены, что других файлов не будет.
Ответ 3
Добавление .dockerignore работает для меня. Еще один момент. Те, кто пробует это решение в Windows, Windows не позволят вам создать файл .dockerignore (так как он по умолчанию не позволяет создавать файл, начиная с.)
Чтобы создать такой файл, начиная с. в Windows трюк с этим упоминается здесь: https://www.hanselman.com/blog/HowToCreateAFileWithADotPrefixInWindowsExplorer.aspx
которая также включает конечную точку, например: .dockerignore.
и нажмите Enter (при условии, что вы включили параметры просмотра расширений из параметров папки)
Ответ 4
В моем случае, мой Dockerfile содержал шаг установки, который создавал каталог vendor
(эквивалент PHP node_modules
). Затем я COPY
этот каталог в окончательное изображение приложения. Поэтому я не мог поставить vendor
в свой .dockerignore
. Мое решение состояло в том, чтобы просто удалить каталог перед выполнением composer install
(PHP-эквивалент npm install
).
FROM composer AS composer
WORKDIR /app
COPY . .
RUN rm -rf composer.lock vendor \
&& composer install
FROM richarvey/nginx-php-fpm
WORKDIR /var/www/html
COPY --from=composer /app .
Это решение работает и не раздувает конечный образ, но оно не идеально, поскольку каталог vendor
на хосте копируется в контекст Docker во время процесса сборки, что добавляет время.