Я создал несколько разных каталогов на своем хост-компьютере, пытаясь узнать о 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 3,5 ГБ. Есть ли что-то еще, о чем я не знаю, пока вы продолжаете создавать образы Docker? Накапливается ли моя память по мере того, как я создаю больше изображений в других каталогах на моем хост-компьютере?
.dockerignore
Ответы:
Клиент Docker отправляет весь «контекст сборки» демону Docker. Этот контекст сборки (по умолчанию) - это весь каталог, в котором
Dockerfile
находится (то есть всеrpms
дерево).Вы можете настроить
.dockerignore
файл, чтобы Docker игнорировал некоторые файлы. Вы можете поэкспериментировать с этим.В качестве альтернативы вы можете переместить свою
rpms
папку на один уровень каталога выше вашегоDockerfile
, и только символическую ссылкуtest.rpm
вDockerfile
каталог.Как отмечали многие пользователи в комментариях, нужно добавить
.git
папку в папку,.dockerignore
которая в моем случае была причиной разницы в 150 МБ -> 5 ГБ.источник
ADD
команда не следует символическим ссылкам во время сборки. См .: github.com/docker/docker/issues/1676tmp
log
к.dockerignore
+ другим кастомным.git
папка включена по умолчанию - это меня определенно зацепило.Обновление 2019
Начиная с Docker v18.06 есть возможность использовать новый конструктор образов под названием Build Kit .
Он предустановлен с Docker, ничего устанавливать не нужно. Он обратно совместим с
Dockerfile
синтаксисом, нет необходимости изменятьDockerfile
.Устаревшая сборка Docker против нового набора Docker BuildKit
Вот пример создания образа с огромным неиспользуемым файлом в каталоге сборки:
Устаревшая сборка Docker:
Новый Docker BuildKit:
Единственное изменение -
DOCKER_BUILDKIT=1
переменная окружения, разница во времени огромная..dockerignore
файлОбратите внимание, что
.dockerignore
файл по-прежнему действителен и полезен. НекоторыеDockerfile
команды, напримерCOPY . .
, по-прежнему будут учитывать.dockerignore
правила. Но побочные файлы в каталоге сборки (не упомянутые вDockerfile
) больше не копируются BuildKit как «контекст сборки».источник
Я исправил это, переместив свой Dockerfile и docker-compose.yml во вложенную папку, и он отлично работал. Видимо докер отправляет текущую папку демону и у меня в папке было 9 гигов.
источник
Если у вас есть
.dockerignore
файл и контекст сборки по-прежнему велик, вы можете проверить, что отправляется в контекст сборки докера, с помощью Silver Searcher :Обратите внимание, что некоторые
**
шаблоны могут работать неправильно.Дополнительные комментарии см. В этой проблеме Github: https://github.com/moby/moby/issues/16056
источник
В моем случае это было, когда я выполняю с неправильными
-f
аргументами - без пути к каталогу, в котором находится Dockerfiledocker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/
- правоdocker build --no-cache -t nginx5 -f /home/DF/Dockerfile
- неправильноисточник
Если вы хотите полностью контролировать свой контекст сборки, вы также можете полностью построить контейнер без какого-либо контекста и
COPY
соответствующих данных в контейнере впоследствии.Одним из недостатков этого подхода является то, что при таком подходе вы можете только
ADD
вещи в файле докеров, ссылающиеся на удаленный URL-адрес, а не файлы с вашего локального хоста.См. Https://docs.docker.com/engine/reference/commandline/build/#build-with--
источник
У меня была та же проблема, что и с FreeStyler. Однако я строил из каталога, находящегося выше моего контекста. Значит, аргументы -f верны, контекст неверен.
Сборка из docker-dir была в порядке
Сборка из dock-dir контекст сборки изменился. Поэтому мне нужно было изменить контекст в команде. Контекст задается символом '.' в команде выше.
Новая команда из каталога проекта должна быть
Контекст здесь задается './base'
источник
если вы создаете изображение и получаете сообщение об отправке контекста сборки демону докера, для копирования которого требуется время журнала,
затем добавьте файл .dockerignore . он должен включать файлы или каталог, которые не нужно копировать.
источник
Для
NodeJS Application
добавления.dockerignore
файла в корневой каталог проекта и внутри.dockerignore
файла добавьте следующиеисточник