Построить контекст
Команды docker build или docker buildx build создают образы Docker из Dockerfile и «контекста».
Контекст сборки — это множество файлов, расположенных по адресу PATH
или URL
, указанному в качестве позиционного аргумента команды сборки:
$ docker build [OPTIONS] PATH | URL | -
^^^^^^^^^^^^^^
Процесс сборки может ссылаться на любой из файлов в контексте. Например, ваша сборка может использовать инструкцию COPY для ссылки на файл в контексте или инструкцию RUN –mount=type=bind для лучшей производительности с BuildKit. Контекст сборки обрабатывается рекурсивно. Так, PATH
включает любые подкаталоги, а URL
включает репозиторий и его подмодули.
контекст PATH
В этом примере показана команда сборки, которая использует текущий каталог (.
) в качестве контекста сборки:
$ docker build .
...
#16 [internal] load build context
#16 sha256:23ca2f94460dcbaf5b3c3edbaaa933281a4e0ea3d92fe295193e4df44dc68f85
#16 transferring context: 13.16MB 2.2s done
...
С помощью следующего Dockerfile:
FROM busybox
WORKDIR /src
COPY foo .
И эта структура каталогов:
.
├── Dockerfile
├── bar
├── foo
└── node_modules
Наследный сборщик отправляет демону весь каталог, включая каталоги bar
и node_modules
, даже если Dockerfile
их не использует. При использовании BuildKit клиент посылает только файлы, требуемые инструкцией COPY
, в данном случае foo
.
В некоторых случаях вы можете захотеть отправить весь контекст:
FROM busybox
WORKDIR /src
COPY . .
Вы можете использовать файл .dockerignore, чтобы исключить некоторые файлы или каталоги из отправки:
# .dockerignore
node_modules
bar
Предупреждение
Избегать использования корневого каталога, /
, в качестве PATH
для контекста сборки, т. к. это приведёт к тому, что сборка передаст демону все содержимое вашего жесткого диска.
контекст URL
Параметр URL
может относиться к трем типам ресурсов: Git-репозитории Pre-packed контексты tarball Plain текстовые файлы
Git-репозитории
Когда параметр URL
указывает на расположение Git-репозитория, репозиторий выступает в качестве контекста сборки. Сборщик рекурсивно извлекает репозиторий и его подмодули. Выполняется неглубокое клонирование, поэтому извлекаются только последние коммиты, а не вся история. Сначала репозиторий извлекается во временный каталог на вашем хосте. После этого каталог передаётся демону в качестве контекста. Локальное копирование предоставляет вам возможность получает доступ к частным репозиториям, используя учетные данные локального пользователя, VPN и т.д.
Примечание
Если параметр URL
содержит фрагмент, система будет рекурсивно клонировать хранилище и его подмодули с помощью команды git clone --recursive
.
URL-адреса Git принимают параметр конфигурации контекста в виде фрагмента URL-адреса, разделенного двоеточием (:
). Первая часть представляет ссылку, которую Git будет проверять, и может быть веткой, меткой или удаленной ссылкой. Вторая часть представляет собой подкаталог внутри репозитория, который будет использоваться в качестве контекста сборки.
Например, выполняет эту команду, чтобы использовать каталог под названием docker
в ветке container
:
$ docker build https://github.com/user/myrepo.git#container:docker
В следующей таблице представлены все допустимые суффиксы с их контекстами сборки:
Построить синтаксический суффикс |
Использованный коммит |
Используемый строительный контекст |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
По умолчанию каталог .git
не сохраняется при проверке Git. Вы можете установить встроенный arg BUILDKIT_CONTEXT_KEEP_GIT_DIR=1 в BuildKit, чтобы он сохранялся. Это может быть полезно, если вы хотите получает информацию о Git’е во время сборки:
# syntax=docker/dockerfile:1
FROM alpine
WORKDIR /src
RUN --mount=target=. \
make REVISION=$(git rev-parse HEAD) build
$ docker build --build-arg BUILDKIT_CONTEXT_KEEP_GIT_DIR=1 https://github.com/user/myrepo.git#main
Контексты тарболов
Если вы передаете URL
в удаленный tarball, сам URL
отправляется демону:
$ docker build http://server/context.tar.gz
#1 [internal] load remote build context
#1 DONE 0.2s
#2 copy /context /
#2 DONE 0.1s
...
Операция загрузки будет выполняться на хосте, на котором запущен демон, что не обязательно совпадает с хостом, с которого подается команда сборки. Демон получит context.tar.gz
и будет использовать его в качестве контекста сборки. Контексты Tarball должны быть архивами tar, соответствующими стандартному формату tar
UNIX, и могут быть сжаты любым из форматов xz
, bzip2
, gzip
или identity
(без сжатия).
Текстовые файлы
Вместо указания контекста вы можете передать один файл Dockerfile
в URL
или передать файл через STDIN
. Чтобы передать файл Dockerfile
через STDIN
:
$ docker build - < Dockerfile
С помощью Powershell в Windows можно запускать:
Get-Content Dockerfile | docker build -
Если вы используете STDIN
или указываете URL
, указывающий на обычный текстовый файл, система помещает содержимое в файл с именем Dockerfile
, и любой параметр -f
, --file
игнорируется. В этом сценарии контекст отсутствует.
Следующий пример строит образ, используя Dockerfile
, который передаётся через stdin. Никакие файлы не передаются демону в качестве контекста сборки.
docker build -t myimage:latest -<<EOF
FROM busybox
RUN echo "hello world"
EOF
Отказ от контекста сборки может быть полезен в ситуациях, когда ваш Dockerfile
не требует копирования файлов в образ, и вызывает скорость сборки, поскольку демону не передаются файлы.