Построить контекст

Команды 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

В следующей таблице представлены все допустимые суффиксы с их контекстами сборки:

Построить синтаксический суффикс

Использованный коммит

Используемый строительный контекст

myrepo.git

refs/heads/master

/

myrepo.git#mytag

refs/tags/mytag

/

myrepo.git#mybranch

refs/heads/mybranch

/

myrepo.git#pull/42/head

refs/pull/42/head

/

myrepo.git#:myfolder

refs/heads/master

/myfolder

myrepo.git#master:myfolder

refs/heads/master

/myfolder

myrepo.git#mytag:myfolder

refs/tags/mytag

/myfolder

myrepo.git#mybranch:myfolder

refs/heads/mybranch

/myfolder

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