Построить контекст для изображения докеров очень большой
Я создал пару разных каталогов на моем хост-компьютере, так как я пытаюсь узнать о 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? Я накопила память, когда создаю больше изображений в других каталогах на моей главной машине?
Ответы
Ответ 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--