Подтвердить что ты не робот

Построить контекст для изображения докеров очень большой

Я создал пару разных каталогов на моем хост-компьютере, так как я пытаюсь узнать о Docker только для того, чтобы сохранить мои файлы докеров. Мой файл 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 daemon 3.5 ГБ. Есть ли что-то еще, о чем я не знаю, поскольку вы продолжаете создавать изображения Docker? Я накопила память, когда создаю больше изображений в других каталогах на моей главной машине?

4b9b3361

Ответ 1

Клиент Docker отправляет весь "контекст сборки" демону Docker. Этот контекст сборки (по умолчанию) - это весь каталог, в котором находится Dockerfile (то есть, все дерево rpms).

Вы можете настроить файл .dockerignore, чтобы Docker игнорировал некоторые файлы. Возможно, вы захотите поэкспериментировать с этим.

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


Как отмечали многие пользователи в комментариях, нужно добавить папку .git в .dockerignore, что послужило причиной разницы в 150 МБ → 5 ГБ в моем случае.

Ответ 2

Обновление 2019

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

Это предварительно в комплекте с докером, не нужно ничего устанавливать. Он обратно совместим с синтаксисом Dockerfile, нет необходимости изменять Dockerfile.

Старая версия Docker Build vs New Docker BuildKit

Вот пример построения изображения с огромным неиспользуемым файлом в каталоге сборки:

Сборка Legacy 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.

Ответ 3

Я исправил его, переместив файл Dockerfile и docker-compose.yml во вложенную папку, и он отлично работал. Очевидно, докер отправляет текущую папку демону, а моя папка - 9 концертов.

Ответ 4

Если у вас есть файл .dockerignore и контекст сборки все еще велик, вы можете проверить, что отправляется в контекст сборки докера, с помощью Серебряного поисковика:

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

Обратите внимание, что некоторые паттерны ** могут работать неправильно.

Посмотрите эту проблему Github для дополнительных комментариев: https://github.com/moby/moby/issues/16056

Ответ 5

В моем случае это было, когда я выполнял с неправильными аргументами -f - без пути к каталогу, где расположен Dockerfile

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/ - правый

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile - неверно

Ответ 6

У меня была такая же проблема, как и 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'

Ответ 7

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

docker build - < Dockerfile

Недостатком этого является то, что при таком подходе вы можете ADD только вещи в файле Docker, ссылающиеся на удаленный URL, а не файлы с вашего локального хоста.

Видеть https://docs.docker.com/engine/reference/commandline/build/#build-with--