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

Я пытаюсь создать образ докера, избегая ненужных групп, и столкнулся с проблемой, которая, на мой взгляд, должна быть распространенной, но до сих пор я не нашел простого решения. (Я собираю докер в системе Ubuntu 18.04 и начинаю со слоя FROM ubuntu.)

В частности, у меня есть очень большой файл .deb (через 3G), который мне нужно установить в образе. Достаточно просто набрать COPY или ADD, а затем RUN dpkg -i, но это приводит к дублированию нескольких ГБ пространства, которое мне не нужно. Конечно, простое удаление файла не уменьшает размер изображения.

Я бы хотел иметь возможность смонтировать том для доступа к файлу .deb, а не к COPY, что легко сделать при запуске контейнера, но, по-видимому, невозможно при его создании?

То, что я до сих пор придумал, - это собрать докер до того места, где я ADD запишу файл, а затем запустить его с подключенным томом, чтобы я мог получить к нему доступ из контейнера без COPY ing это, затем я dpkg -i это, затем я делаю фиксацию Docker для создания изображения из этого контейнера. Конечно же, я получаю изображение, которое на 3 ГБ меньше, чем моя первая попытка, но это выглядит как хак и усложняет создание сценариев сборки.

Я думаю, что должен быть более подходящий способ добиться этого, но пока мои поиски не выявили очевидного ответа. Я что-то упустил?

1 Ответ

0 голосов
/ 07 сентября 2018

Полагаться на 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 / /).

...