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 во время процесса сборки, что добавляет время.