Docker, NodeJS

Running sharp on Alpine Linux Docker Container

Running sharp on Alpine Linux Docker Container

sharp is a Node.js image processing library that we used to resize avatar images in the backend. We run into problems running sharp on a Docker container using the Node.js Alpine Linux image as it cannot find the binary dependency for Alpine Linux.

Development Environment

According to the docs, we can setup sharp as a cross-platform installation as developers may use different environments. In our development environment, we install sharp this way:

npm install --save sharp
npm rebuild --arch=x64 --platform=linux --libc=musl sharp
npm rebuild --arch=x64 --platform=linux --libc=glibc sharp

First, we install it using the default behavior that detects the current environment like Windows for example. Then we add more installations for Alpine Linux and Debian based Linux like Ubuntu. This should work for now. This is not enough though as we need to tweak our Dockerfile to rebuild sharp for Alpine Linux.

Production Environment

This is our updated Dockerfile. It simply installs whatever was installed as specified by the package-lock.json then rebuild sharp again to download the correct binary for Alpine Linux.

FROM node:18.16.0-alpine3.17
WORKDIR /app
COPY . .
RUN chown -R node:node /app
USER node
RUN npm install && \
    npm rebuild --arch=x64 --platform=linux --libc=musl sharp && \
    npm run build

EXPOSE 3000
CMD ["node", "dist/main.js"]

It works flawlessly.

Featured image by Azis Js.