Если вы не можете использовать .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.