📓 Гист
Вы можете подумать, что ваш 100 МБ Альпийские изображения маленькие — но как насчет 100 КБ? Меньшее изображение корабля быстрее и содержит меньше векторов атаки. Более того, оптимизируя изображения, вы обнаружите и изолируете именно то, что нужно для вашего приложения.
Давайте оптимизировать.
Существует две ключевые характеристики изображений на основе царапин:
- У DockerFile имеет два этапа сборки:
- Строитель — который содержит все зависимости сборки, включая источник, библиотеки и инструменты и ..
- Окончательное изображение, содержащее двоичные и любые зависимости выполнения (файлы конфигурации, сертификаты и динамически связанные библиотеки)
- Окончательное изображение —
С нуля
— Пустое изображение докера
При таком подходе ваше изображение выполнения будет содержать именно то, что необходимо для вашего приложения для запуска — никаких дополнительных файлов конфигурации, демонов или библиотек, которые могут быть неправильно настроены или эксплуатируются.
Давайте перейдем на базовый статический Hello World Scratch Image. Мы будем использовать C, поскольку требуется наименьшее количество зависимостей и производит крошечные двоичные файлы ELF.
Создайте Hello World
Привет
#includeint 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»