У Dockerfile у мене є
COPY . .
Я хочу виключити весь каталог, в моєму випадку - каталог node_modules.
Щось на зразок цього:
COPY [all but **/node_modules/**] .
Це можливо з Докером?
У Dockerfile у мене є
COPY . .
Я хочу виключити весь каталог, в моєму випадку - каталог node_modules.
Щось на зразок цього:
COPY [all but **/node_modules/**] .
Це можливо з Докером?
Відповіді:
Створіть файл .dockerignore
у своєму контекстному каталозі docker build (так що в цьому випадку, швидше за все, каталог, який є батьківським для node_modules) з одним рядком у ньому:
**/node_modules
хоча ти, мабуть, просто хочеш:
node_modules
Інформація про dockerignore: https://docs.docker.com/engine/reference/builder/#dockerignore-file
/config/nginx/ /config/logstash/
я знаходжу це в контейнері баш: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
каталог на хості копіюється в контекст Докера під час процесу збирання, що додає часу.
composer.lock
раніше composer install
. Без файлу блокування інший набір залежностей (папка постачальника) може бути встановлений при наступному складанні.
Додавання .dockerignore працює для мене. Один додатковий момент Тим, хто намагається це рішення в Windows , Windows не дасть вам створити .dockerignore файл (оскільки він за замовчуванням не дозволяє створювати файл, починаючи з.)
Щоб створити такий файл, починаючи з. на ОС Windows , включають в себе закінчення точка також, як: .dockerignore.
і натисніть клавішу Enter (якщо ви включили переглядати варіанти розширення з варіантів папки)
Виключення node_modules з поточного каталогу
node_modules
Виключення node_modules в будь-яких безпосередніх підкаталогах
*/node_modules
.dockerignore
?