многоступенчатый docker — зачем копировать часть папки, в результате чего изображение будет больше, чем копировать всю папку?

#docker

#docker

Вопрос:

Я хочу создать наименьшее изображение, возможное для моего проекта, поэтому я использую многоступенчатый docker с distroless. Я копирую только те файлы, которые необходимы для выполнения. Из нескольких папок я копирую только .so файлы, а не копирую всю папку, и я вижу, что созданное изображение становится меньше.

Но есть одна папка, в которой при копировании всей папки я получаю изображение значительно меньшего размера, чем при копировании только .so файлов.

С помощью следующего файла Dockerfile я копирую всю папку /usr/lib/x86_64-linux-gnu:

 #stage 1
FROM some_image AS builder

ADD something /home/

RUN mkdir ...
    cmake ...

#stage 2
FROM gcr.io/distroless/cc-debian10

COPY --from=builder /home/some/folders
COPY --from=builder /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu

WORKDIR /home/

CMD ["/bin/bash"]
 

И размер изображения составляет 618 МБ.

Но со следующим файлом Dockerfile я копирую только *.so файлы из папки / usr/lib/x86_64-linux-gnu:

 #stage 1
FROM some_image AS builder

ADD something /home/

RUN mkdir ...
    cmake ...

#stage 2
FROM gcr.io/distroless/cc-debian10

COPY --from=builder /home/some/folders
COPY --from=builder /usr/lib/x86_64-linux-gnu/*.so /usr/lib/x86_64-linux-gnu/*.so.* /usr/lib/x86_64-linux-gnu/

WORKDIR /home/

CMD ["/bin/bash"]
 

И, что удивительно, размер изображения теперь составляет 683 МБ. Что на 65 МБ больше.

Есть идеи, что может вызвать такие результаты?

Комментарии:

1. Вы проверили результирующее изображение при копировании только папки, чтобы посмотреть, что на самом деле внутри /usr/lib/x86_64-linux-gnu/ ?

2. Это основано на imgae без дистрибутива, поэтому оболочки нет. Но я проверяю это с помощью инструмента погружения и вижу, что на одном изображении файлы в x86_64-linux-gnu — это только *.so file, в то время как на другом изображении есть и другие типы. Размер папки x86_64-linux-gnu, содержащей только файлы * .so, составляет 438 МБ, а в другом изображении — 366 МБ.

Ответ №1:

После долгого расследования я обнаружил, что:

  • Копирование всей папки с символическими ссылками сохраняет символические ссылки
  • Копирование символических ссылок напрямую создает обычные файлы

Итак, в моем случае копирование всех *.so файлов приводит к копированию каждой символической ссылки как обычного файла, на который указывает эта символическая ссылка. Этот переход приводит к увеличению размера моего изображения.

После того, как я это понял, я погуглил и нашел ссылку здесь