Создать образ Docker, используя сборку Docker и tmpfs?
Вопрос: Как вы указываете в Dockerfile, или на docker build
командной строки, что бы вы хотели, чтобы tmpfs был установлен в сборочном контейнере? Это в контексте разделенной сборки - первый контейнер, который будет использовать RAM-диск, собирает приложение из исходного кода, а второй этап копирует результат в новый контейнер.
Этот вопрос кажется похожим, но мои мотивы отличаются. Меня не очень заботит сохранение устаревших слоев изображения, но меня интересует производительность сборки. При экспериментировании за пределами Docker создание конкретного приложения, с которым я работаю, было в 4 раза быстрее, когда все дерево исходных текстов было в ОЗУ, а не на диске. (У проекта много промежуточных сборок и параллелизм, поэтому даже SSD имеет тенденцию немного крутиться)
Так как Docker поддерживает монтирование tmpfs во время обычного docker run
команда, казалось бы, должен быть способ включить это в Dockerfile? Тем не менее, я не могу найти эту информацию где-либо - почти каждый поиск по "tmpfs" и "dockerfile" или "build" или "ramdisk" и т. Д. Просто указывает либо на вышеуказанный связанный пост, либо на документы Docker об использовании tmpfs в контейнеры начались с docker run
,
Было бы приемлемо, если бы tmpfs не сохранялся даже до сборки второго контейнера. Это можно исправить, просто скопировав собранное приложение из tmpfs в контейнере сборки перед выходом из этого контейнера, а затем используя это новое местоположение при копировании.
2 ответа
С помощью BuildKit вы можете использовать экспериментальные функции для монтирования файловой системы tmpfs для одного RUN
линия. Эта файловая система не будет существовать вне контекста этого RUN
строка, так же как tmpfs не существует, когда контейнер был остановлен или удален, поэтому вам нужно будет скопировать любые артефакты обратно в файловую систему контейнера в конце вашей сборки.
Для BuildKit вам нужно как минимум 18.09, и вы можете включить его:
export DOCKER_BUILDKIT=1
для отдельной оболочки или для изменения значения по умолчанию на хосте вы можете обновить /etc/docker/daemon.json с помощью:
{
"features": {"buildkit": true}
}
С включенным BuildKit Dockerfile будет выглядеть так:
# syntax=docker/dockerfile:experimental
FROM your_base_image
COPY src /src
RUN --mount=type=tmpfs,target=/build \
cp -r /src/. /build/ \
&& cd /build \
&& make your_project \
&& cp /build/result.bin /result.bin
...
Обратите внимание, что BuildKit является довольно новым, не будет поддерживаться в большинстве сред облачной сборки и пока не поддерживается в docker-compose. Чтобы узнать больше об этих экспериментальных функциях, см. https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md
В Docker точки монтирования настраиваются только тогда, когда вы docker run
, Каталоги в докер-файле не должны изменять его поведение. Вот почему точки крепления только в работе.
Я надеюсь, что это помогает!