Рубрики
Uncategorized

Построить 100 КБ докер изображения с нуля

Создание самых маленьких и простейших изображений докера с помощью царапины. Здравствуйте, мир в C. Multi Stage Docker Images. Теги с DevOps, учебником, Docker.

📓 Гист

Вы можете подумать, что ваш 100 МБ Альпийские изображения маленькие — но как насчет 100 КБ? Меньшее изображение корабля быстрее и содержит меньше векторов атаки. Более того, оптимизируя изображения, вы обнаружите и изолируете именно то, что нужно для вашего приложения.

Давайте оптимизировать.

Существует две ключевые характеристики изображений на основе царапин:

  1. У DockerFile имеет два этапа сборки:
    • Строитель — который содержит все зависимости сборки, включая источник, библиотеки и инструменты и ..
    • Окончательное изображение, содержащее двоичные и любые зависимости выполнения (файлы конфигурации, сертификаты и динамически связанные библиотеки)
  2. Окончательное изображение — С нуля — Пустое изображение докера

При таком подходе ваше изображение выполнения будет содержать именно то, что необходимо для вашего приложения для запуска — никаких дополнительных файлов конфигурации, демонов или библиотек, которые могут быть неправильно настроены или эксплуатируются.

Давайте перейдем на базовый статический Hello World Scratch Image. Мы будем использовать C, поскольку требуется наименьшее количество зависимостей и производит крошечные двоичные файлы ELF.

Создайте Hello World

Привет

#include 
int main(void){
    puts("Hello World\n");
}

Макияж

hello: hello.c
    gcc -o $@  $< -static 

Dockerfile.

.dockerignore.

# this prevents our host binary from sneaking into the build
hello

Dockerfile

FROM alpine:latest as builder
WORKDIR /build
RUN apk update && \
    apk add gcc make libc-dev
COPY .  ./
RUN make

FROM scratch
WORKDIR /
COPY --from=builder /build/hello .
CMD ["/hello"]

Обратите внимание, что у нас есть два От S, один под названием строитель Отказ Последнее изображение будет нашим бегуном. Использование Скопировать --от Мы можем выбрать, какие файлы попадают в изображение царапин. С статическим двоичным эльфом нам нужен только /построить/привет

Построить и бежать

$ docker build . -t hello-scratch|tail -n 1
Successfully tagged hello-scratch:latest
$ docker run hello-scratch                 
Hello World

Наше последнее изображение составляет 82,7 кб

$ docker images |grep hello-scratch | egrep -o '[^ ]+$'
82.7kB

Что внутри?

Использование Докер Сохранить Вы можете осмотреть изображение и увидеть, что слой.тар Содержит только один файл: Привет

$ mkdir hello-scratch && cd hello-scratch 
$ docker save hello-scratch |tar -x
$ ls
3e69d91b5842be72dcd4175adcf218a03f78826504be6a46ed41c099e97520e8.json  e599e214ce17b356493f9524fa57f7ef816d21dd78020019196020c770a39954  manifest.json  repositories
$ ✗ tar -tf e599e214ce17b356493f9524fa57f7ef816d21dd78020019196020c770a39954/layer.tar 
hello

Следующие шаги

В предстоящих постах я покажу несколько сложных примеров. Этот процесс проще всего со статически скомпилированными приложениями, такими как C, C ++, Golang & Rust. Но с надлежащим инструментом любое изображение может быть построено при условии, что вы собираете все зависимости выполнения в финал царапина изображение.

Оригинал: «https://dev.to/tonymet/build-100kb-docker-images-from-scratch-4ll5»