КОПІЯ з докером, але з виключенням


231

У Dockerfile у мене є

COPY . .

Я хочу виключити весь каталог, в моєму випадку - каталог node_modules.

Щось на зразок цього:

   COPY [all but **/node_modules/**] .

Це можливо з Докером?



Я шукаю відповідь на це пов’язане питання: stackoverflow.com/questions/50547489/…
Олександр Міллс

Відповіді:


377

Створіть файл .dockerignoreу своєму контекстному каталозі docker build (так що в цьому випадку, швидше за все, каталог, який є батьківським для node_modules) з одним рядком у ньому:

**/node_modules

хоча ти, мабуть, просто хочеш:

node_modules

Інформація про dockerignore: https://docs.docker.com/engine/reference/builder/#dockerignore-file


5
дякую, тож "КОПІЯ". команду змінювати не потрібно, я думаю
Олександр Міллз

Не дуже:, /config/nginx/ /config/logstash/я знаходжу це в контейнері баш:ls config/ gunicorn logs logstash nginx
SalahAdDin

3
@SalahAdDin з тієї ж причини, яку ви не писали ls /config/, ви намагалися додати ці шляхи до свого .dockerignore без ведучого /?
Пабло

8
Просто node_modulesне працює в підкаталогах.
rustyx

5
Це насправді не вирішує проблему, якщо ви хочете мати її COPY'd, але тільки не в цьому шарі ...
Уес

33

Для тих, хто не може використовувати .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'

Продовжуйте, поки ви не отримаєте повне ім'я файлу або просто префікс, на який ви впевнені, що інших файлів не буде.


1
Це не суттєво, тому що ви отримаєте, COPY failed: no source files were specifiedколи файлів не починається з "ні", але не "кивати".
mheck

1
Крім того, ви можете використовувати два різних підкаталога (для різних цілей копіювання), так що, наприклад, у моїй установці nginx я повинен був би src/перейти /var/wwwі /conf/nginx.confперейти /etc/nginx/conf.d/default.conf. Крім того, ви можете скопіювати все, а RUN rm -r confпізніше (занадто зберегти початкове дерево таким, яким воно було). Мені хотілося б почути, чи є у когось інша пропозиція.
Ювал

1
Що було б рішенням для конкретних типів файлів або закінчень файлів, якби я зробив це так?
Леа Рейманн

Єдиним недоліком такого підходу є те, що структура вашої папки вирівняна
Islam Q.

Якщо у вас є лише кілька каталогів, які потрібно скопіювати (скажіть лише "/ app" або "/ src"). Простішим способом було б копіювати каталоги окремо (щоб зберегти їх структуру), і тоді вам знадобиться лише один, COPY [^node_modules]*щоб скопіювати всі файли верхнього рівня.
smdufb

9

У моєму випадку мій 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каталог на хості копіюється в контекст Докера під час процесу збирання, що додає часу.


3
Зверніть увагу, чому ви повинні видалити composer.lockраніше composer install. Без файлу блокування інший набір залежностей (папка постачальника) може бути встановлений при наступному складанні.
Лачек

1
@Lacek: Ти маєш рацію. Я навчився краще, коли я опублікував це.
Камерон Хадсон

1
@CameronHudson, можливо, оновіть оригінальну відповідь, перш ніж люди копіюють / вставляють цю погану практику.
Робін ван Баален

2

Додавання .dockerignore працює для мене. Один додатковий момент Тим, хто намагається це рішення в Windows , Windows не дасть вам створити .dockerignore файл (оскільки він за замовчуванням не дозволяє створювати файл, починаючи з.)

Щоб створити такий файл, починаючи з. на ОС Windows , включають в себе закінчення точка також, як: .dockerignore.і натисніть клавішу Enter (якщо ви включили переглядати варіанти розширення з варіантів папки)


6
Ви можете створити файл у Windows, який починається з крапки, також закінчивши його крапкою.
Джим Педід

0

Виключення node_modules з поточного каталогу

node_modules

Виключення node_modules в будь-яких безпосередніх підкаталогах

*/node_modules

Ось офіційні документи

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.