Сборка докера - Избегайте добавления файлов, необходимых только во время сборки
Я пытаюсь создать образ докера, избегая ненужных групп, и столкнулся с проблемой, которая, на мой взгляд, должна быть распространенной, но до сих пор я не нашел простого решения. (Я собираю докер в системе Ubuntu 18.04 и начинаю с FROM ubuntu
слой.)
В частности, у меня есть очень большой файл.deb (через 3G), который мне нужно установить в образе. Это достаточно легко COPY
или же ADD
это и потом RUN dpkg -i
, но это приводит к дублированию нескольких ГБ пространства, которое мне не нужно. Конечно, простое удаление файла не уменьшает размер изображения.
Я хотел бы иметь возможность смонтировать том для доступа к .deb
файл, а не COPY
это, что легко сделать при запуске контейнера, но, по-видимому, невозможно сделать при его создании?
До сих пор я придумал, как построить докер так, чтобы я ADD
файл, затем запустите его с подключенным томом, чтобы я мог получить к нему доступ из контейнера без COPY
если я это сделаю, то я dpkg -i
затем я делаю фиксацию Docker для создания изображения из этого контейнера. Конечно же, я получаю изображение, которое на 3 ГБ меньше, чем моя первая попытка, но это выглядит как хак и усложняет создание сценариев сборки.
Я думаю, что должен быть более подходящий способ достичь этого, но пока мои поиски не выявили очевидного ответа. Я что-то пропустил?
1 ответ
Надеется docker commit
на самом деле равносильно взлому:) и его использование, таким образом, упоминается как нежелательное в некоторых ссылках, таких как эта статья в блоге.
Я вижу только один возможный подход для упомянутого вами варианта использования (скопируйте один раз .deb
пакет, установите его и немедленно удалите двоичный файл со слоя изображения):
Вы можете сделать удаленно доступным для механизма докера, который создает ваш образ, .deb
Вы хотите установить и заменить COPY
+ RUN
директивы с одним, например, опираясь на curl
:
RUN curl -OL https://example.com/foo.deb && dpkg -i foo.deb && rm -f foo.deb
Если curl
еще не установлен, вы можете заранее запустить обычные команды APT:
RUN apt-get update -y -q \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y -q --no-install-recommends \
ca-certificates \
curl \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
Возможно, есть другое возможное решение (но я не думаю, что функция Docker для многоступенчатых сборок была бы здесь полезна, так как все перманенты будут потеряны при выполнении, например, COPY --from=build / /
).