контекст побудови зображення докера дуже великий


142

Я створив кілька різних каталогів на своїй хост-машині, коли я намагаюся дізнатися про Docker лише для того, щоб організувати свої dockerfiles. Мій щойно запущений Dockerfile виглядає так:

FROM crystal/centos
MAINTAINER crystal

ADD ./rpms/test.rpm ./rpms/ 
RUN yum -y --nogpgcheck localinstall /rpms/test.rpm 

Мій фактичний об / хв становить лише 1 ГБ. Але коли я намагаюся це зробити sudo docker build -t="crystal/test" ., я надсилаю контекст збірки до демона Docker розміром 3,5 Гб. Чи є ще щось, про що я не знаю, коли ви продовжуєте створювати Docker-образи? Чи накопичується моя пам'ять, коли я створюю більше зображень у інших своїх каталогах на своїй хост-машині?


2
Контекст збірки - це всі файли / каталоги в поточному каталозі.
Nabin

Зберігайте в цьому каталозі лише ті файли, які потрібні для складання. Тобто Dockerfile та будь-які локальні файли / каталоги скопіювали / додали до зображення збірки в Dockerfile. Також скористайтеся.dockerignore
Вішрант

Відповіді:


266

Клієнт Docker надсилає весь демонстраційний контекст до демона Docker. Контекст побудови (за замовчуванням) - це весь каталог, в якому Dockerfileзнаходиться (значить, усе rpmsдерево).

Ви можете налаштувати .dockerignoreфайл, щоб змусити Docker ігнорувати деякі файли. Можливо, ви захочете експериментувати з цим.

Крім того, ви можете перемістити rpmsпапку на один рівень вище свого каталогу Dockerfileі лише посилатись test.rpmу Dockerfileкаталог s.


Як зазначили в коментарях багато користувачів, потрібно додати .gitпапку, до.dockerignore якої в моєму випадку була різниця 150 Мб -> 5 ГБ.


4
На жаль, схоже, що в цьому випадку символічне посилання неможливо, оскільки ADDкоманда не дотримується символьних посилань під час збирання. Дивіться: github.com/docker/docker/isissue/1676
JimmidyJoo

5
рятівник! Розробники Rails: не забудьте додати tmp logдо .dockerignore+ інших спеціальних
еквівалентно8

7
не забудьте додати папку .git до файлу .dockerignore (припустимо, що ви використовуєте git)
dsncode

8
Так, .gitпапка включена за замовчуванням - це, безумовно, мене вигнало.
Пол Суарт

1
Який саме "контекст побудови"? Я намагався шукати ці файли за допомогою команди RUN докер збірки, але я не бачу файлів у моїй папці Dockerfile всередині файлової системи docker (під час збирання.) Чи може хтось, будь ласка, надати мені простий приклад того, як корисний контекст побудови?
Патрік

52

Оновлення 2019 року

Починаючи з Docker v18.06, є можливість використовувати новий конструктор зображень під назвою Build Kit .

Це попередньо в комплекті з Docker, не потрібно нічого встановлювати. Це назад сумісний із Dockerfileсинтаксисом, не потрібно змінювати Dockerfile.

Legacy Docker Build проти нового Docker BuildKit

Ось приклад побудови зображення з величезним невикористаним файлом у каталозі збірки:

Спадковий накопичувач Docker:

$ time docker image build --no-cache .
Sending build context to Docker daemon  4.315GB
[...]
Successfully built c9ec5d33e12e

real    0m51.035s
user    0m7.189s
sys 0m10.712s

Новий Docker BuildKit:

$ time DOCKER_BUILDKIT=1 docker image build --no-cache .
[+] Building 0.1s (5/5) FINISHED                                                
 => [internal] load build definition from Dockerfile                       0.0s
 => => transferring dockerfile: 37B                                        0.0s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
[...]
 => => writing image sha256:ba5bca3a525ac97573b2e1d3cb936ad50cf8129eedfa9  0.0s

real    0m0.166s
user    0m0.034s
sys 0m0.026s

Єдина зміна - DOCKER_BUILDKIT=1змінна середовище, різниця у часі величезна.

.dockerignore Файл

Зауважте, що .dockerignoreфайл як і раніше дійсний і корисний. Деякі Dockerfileкоманди типу, як COPY . .і раніше, будуть враховувати .dockerignoreправила. Але бічні файли в каталозі збірки (на які не посилається Dockerfile) вже не копіюються BuildKit як "контекст побудови".


1
Важливо зауважити, що DOCKER_BUILDKIT наразі не підтримується для контейнерів Windows. (Лише для Linux, Перелік обмежень: docs.docker.com/develop/develop-images/build_enhancements )
Vaccano

18

Я виправив це, перемістивши свій Dockerfile і docker-compose.yml в підпапку, і він чудово працював. Мабуть, докер посилає поточну папку в демон, а в моїй папці було 9 гігів.


4
Цей метод дає заборонений шлях: поза помилкою контексту побудови, якщо копіюється файл із батьківського каталогу, якесь рішення для цього?
Kitwradr

8

Якщо у вас є .dockerignoreфайл і контекст збірки все ще великий, ви можете перевірити, що надсилається до контексту збирання докера за допомогою програми Silver Searcher :

ag --path-to-ignore .dockerignore --files-with-matches

Зауважте, що деякі **шаблони можуть не працювати належним чином.

Дивіться цей випуск Github для отримання додаткових коментарів: https://github.com/moby/moby/isissue/16056


4

У моєму випадку це було тоді, коли я виконую помилкові -fаргументи - без шляху до каталогу, де знаходяться Dockerfile

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/ - правильно

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile - неправильно


1

Якщо ви хочете повністю контролювати свій контекст збирання, ви також можете повністю скласти контейнер без будь-якого контексту та COPYвідповідних даних у контейнер.

docker build - < Dockerfile

Одним із недоліків цього може бути те, що при такому підході ви можете лише ADDв документі dockerfile посилатися на віддалену URL-адресу, а не файли з вашого локального хоста.

Дивіться https://docs.docker.com/engine/reference/commandline/build/#build-with--


0

У мене був той самий випуск, що і FreeStyler. Однак я будував з каталогу один з мого контексту. Тож аргументи -f були правильними, контекст був неправильним.

project 
|
-------docker-dir 

Будівництво з docker-dir наступним було добре

docker build -t br_base:0.1 . 

Будуючи з dock-dir, контекст збірки змінився. Тому мені потрібно було змінити контекст у команді. Контекст задається символом "." в команді вище.

Нова команда з каталогу проектів повинна бути

docker build -t br_base:0.1 ./base

Контекст тут задається './base'


0

якщо ви створюєте зображення та отримуєте повідомлення, що надсилає контекст складання докеровому демону, який потребує часу для копіювання,

потім додайте .dockerignore файл . він повинен містити файли або каталог, які не потрібно копіювати.


0

Для цього NodeJS Applicationдодайте .dockerignoreфайл у свою кореневу директорію проекту, а всередині цього .dockerignoreфайлу додайте наступне

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