Сейчас с Docker сложностей практически нет. Приложение давно нативное, установка — стандартная. Единственный нюанс, о котором хочется рассказать, — это отсутствие в Docker Hub версий некоторых образов для ARM. А еще бывает, что образ есть, но в нем несовместимые библиотеки, которые нужно перекомпилировать. Если в первом случае все очевидно, то о второй проблеме я бы хотел поговорить подробнее.
Например, в своем проекте я столкнулся с тем, что невозможно собрать модуль [email protected] для Node.js в базовом образе Node из Docker Hub.
Sharp — это высокоскоростной модуль Node.js для преобразования больших изображений распространенных форматов (JPEG, PNG, AVIF и WebP) в более мелкие.
В этом популярном образе были проблемы с зависимостями. Как оказалось, столкнулся с ними не я один.
Суть проблемы — в том, что в образе Docker для сборки зависимостей пакета sharp необходима библиотека libvips версии 8.10.6 или старше, которая идет с glibc 2.29+. В своем файле сборки я использовал образ node:16.3-buster-slim с glibc 2.24. Понадобилось вручную собирать подходящую версию libvips.
Мой Dockerfile:
1 2 3 4 5 6 |
FROM node:16.3-buster-slim WORKDIR /opt/app ADD . . RUN npm install RUN npm run build api CMD ["node", "./dist/apps/api/main.js"] |
Лог установки Sharp на node:16.3-buster-slim:
1 2 3 4 5 6 7 8 9 10 |
#8 21.23 sharp: Installation error: Use with glibc 2.24 requires manual installation of libvips >= 8.10.6 #8 21.23 sharp: Please see https://sharp.pixelplumbing.com/install for required dependencies #8 21.47 npm WARN The package typescript is included as both a dev and production dependency. #8 21.48 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules/fsevents): #8 21.48 npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"arm64"}) #8 21.48 #8 21.51 npm ERR! code ELIFECYCLE #8 21.51 npm ERR! errno 1 #8 21.51 npm ERR! [email protected] install: `(node install/libvips && node install/dll-copy && prebuild-install) || (node install/can-compile && node-gyp rebuild && node install/dll-copy)` #8 21.51 npm ERR! Exit status 1 |
В такой ситуации нужно или пересобирать libvips для ARM64, или же использовать более свежий образ операционной системы. Например, можно взять node:14-alpine, который уже содержит скомпилированные для ARM бинарники и занимает на 700 Мбайт меньше, чем Debian.
Я выбрал хардкорный вариант пересборки библиотеки libvips под ARM64. Добавил несколько строк в Dockerfile:
1 2 3 4 5 6 7 8 9 10 |
FROM node:16.3-buster-slim RUN apt-get update -qq && apt -y upgrade && \ apt-get install -y git build-essential libpng-dev wget pkg-config glib2.0-dev libexpat1-dev autoconf nasm libtool dpkg g++ RUN wget https://github.com/libvips/libvips/releases/download/v8.12.1/vips-8.12.1.tar.gz RUN tar xf vips-8.12.1.tar.gz && cd vips-8.12.1 && ./configure && make && make install && ldconfig WORKDIR /opt/app ADD . . RUN npm install RUN npm run build api CMD ["node", "./dist/apps/api/main.js"] |
И собираю без ошибок.
1 |
docker build -t test -f apps/api/Dockerfile . |
РЕКОМЕНДУЕМ:
Повышаем безопасность Docker
В общем, когда работаешь на менее популярной архитектуре, это может время от времени приводить к проблемам вроде той, что я описал. Но зато теперь вы знаете, что делать в таких случаях!