Сборка докера - Избегайте добавления файлов, необходимых только во время сборки

Я пытаюсь создать образ докера, избегая ненужных групп, и столкнулся с проблемой, которая, на мой взгляд, должна быть распространенной, но до сих пор я не нашел простого решения. (Я собираю докер в системе 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 / /).

Другие вопросы по тегам