Образы Docker в основном ОГРОМНЫЕ, и я мечтаю о крошечном, очень маленьком образе nginx.
Идея состоит в том, чтобы скомпилировать его и создать образ Docker только с nginx
двоичные файлы, файлы конфигурации, необходимые разделяемые библиотеки и т. д.
Возникает вопрос: как определить, какие разделяемые библиотеки потребуются скомпилированному приложению?
Зная список, я бы попробовал создать папку со всеми связанными зависимостями и отправить ее как самый маленький контейнер Docker.
Речь идет не только о nginx, но, скорее, об общем рецепте решения этих проблем. Может быть, здесь помогут какие-нибудь техники кросс-компиляции?
Возникает вопрос: как определить, какие разделяемые библиотеки потребуются скомпилированному приложению?
ldd
это инструмент, который вы ищете. Например, вот ссылки на библиотеки nginx-1.1.19 в Ubuntu 12.04 LTS:
$ which nginx
/usr/sbin/nginx
$ ldd /usr/sbin/nginx
linux-vdso.so.1 => (0x00007fff8fe50000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f02ecdfb000)
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f02ecbc2000)
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007f02ec9b3000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f02ec789000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f02ec54c000)
libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f02ec2ed000)
libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f02ebf12000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f02ebcfb000)
libxml2.so.2 => /usr/lib/x86_64-linux-gnu/libxml2.so.2 (0x00007f02eb99e000)
libxslt.so.1 => /usr/lib/x86_64-linux-gnu/libxslt.so.1 (0x00007f02eb762000)
libexslt.so.0 => /usr/lib/x86_64-linux-gnu/libexslt.so.0 (0x00007f02eb54d000)
libgd.so.2 => /usr/lib/x86_64-linux-gnu/libgd.so.2 (0x00007f02eb306000)
libGeoIP.so.1 => /usr/lib/libGeoIP.so.1 (0x00007f02eb0d1000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f02ead12000)
/lib64/ld-linux-x86-64.so.2 (0x00007f02ed020000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f02eab0d000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f02ea811000)
libgcrypt.so.11 => /lib/x86_64-linux-gnu/libgcrypt.so.11 (0x00007f02ea591000)
libXpm.so.4 => /usr/lib/x86_64-linux-gnu/libXpm.so.4 (0x00007f02ea380000)
libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007f02ea130000)
libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f02e9ef9000)
libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f02e9c5d000)
libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f02e9a35000)
libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f02e9830000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f02e94fb000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f02e92dc000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f02e90d9000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f02e8ed3000)
В отношении того, является ли это разумным способом сделать урезанный док-контейнер, все еще витает в воздухе. Я подозреваю, что вам нужно учесть еще много вещей, прежде чем вы начнете работать.
Контейнер nginx тяжелый, потому что он является производным от базовой установки ОС, а поверх него установлен nginx и все необходимые зависимости и модули. Но эта базовая ОС может использоваться совместно с другими контейнерами, что делает «отходы» менее очевидными каждый раз, когда вы расширяете использование контейнеров.
Также поддержание рецепта сборки (например, когда вам нужно больше модулей или обновлений безопасности, которые могут изменить зависимости) может быть проще с простым Dockerfile, который использует базовый образ ОС и устанавливает пакет nginx из репозиториев, чем выбирать по крупицам то, что вам нужно. .
В любом случае, если вы хотите создать свой собственный (крошечный) базовый образ ОС, у вас есть инструкции в https://docs.docker.com/articles/baseimages/ наряду с предложениями по существующим минимальным.