Копирование файлов вне контекста сборки в Docker без увеличения размера контекста сборки? - PullRequest
1 голос
/ 25 июня 2019

Я ссылался на аналогичный вопрос , но, следуя этому методу, добавил все файлы в родительском каталоге в контекст сборки, что в моем случае заняло более 8 ГБ. Поэтому вопрос в том, как скопировать файлы из родительского каталога, не добавляя файлы в контекст сборки

Структура проекта

Project
|
|--docker-files
|   |
|   |-Dockerfile
|
|--Folder
|   |
|   |--file/to/be/copied
|
|--other files

С помощью флага -f команда docker build -f docker-files/Dockerfile . -t name выполняется в каталоге проекта

.

Одним из решений является включение файла .dockerignore, но он очень грязный, и весь смысл помещения файла docker в подпапку заключался в уменьшении размера контекста сборки.

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Если вы не можете использовать .dockerignore и должны использовать дерево каталогов, как вы его описали, один из подходов заключается в создании альтернативного дерева контекста сборки Docker в вашей локальной системе до того, как вы docker build.

Внутренне способ работы docker build заключается в создании tar-файла контекстного каталога, отправке его по HTTP через сокет Unix демону Docker и последующей распаковке. Это работает, даже если $DOCKER_HOST указывает на виртуальную машину или другую систему, но это означает, что Docker отказался сообщить себе, откуда берется фактический контекст сборки. Копирование дерева с хоста в демон Docker - медленная часть (даже в чисто локальной системе).

Так что вы можете сделать что-то вроде этого:

rm -rf docker-build
mkdir docker-build
cp docker-files/Dockerfile docker-build
cp -a Folder docker-build
docker build -t ... docker-build

Ничто из того, что вы явно не указали в cp, будет в контексте сборки.

Это также работает достаточно хорошо, если по какой-либо причине вы предпочитаете выполнять части последовательности сборки вне Docker (например, повторно использовать очень хорошую последовательность сборки, отличную от Docker, и упаковывать результаты). Это также структура, которую хорошо поддерживает Makefile, если вы в противном случае используете Make.

1 голос
/ 25 июня 2019

file/to/be/copied просто лежит в Folder, поэтому вам просто нужно установить эту папку в качестве контекста сборки, как показано ниже:

docker build -f docker-files/Dockerfile -t abc:1 Folder

Обновлен:

Как вы сказали в комментариях:

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

Если вам есть что игнорировать, добавить только один файл, вы можете использовать !:

.dockerignore

*
!file/to/be/copied

Сначала будут исключены все вещи в папке, затем будет дано исключение для file/to/be/copied.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...