From 3dc4e41b4f2ecf5bce4d4489033582163acdda32 Mon Sep 17 00:00:00 2001 From: Josua Mayer Date: Wed, 3 Sep 2025 15:13:41 +0200 Subject: [PATCH 1/4] Execute docker build-client step on build host, not target By default buildkit executes all steps using applications built for the target platform, if necessary by emulation. The audiobookshelf web client is not architecture-dependent and it's build takes a long time. Update Dockerfile to execute the build-client natively on the build platform, instead of the target platform. This drastically reduces docker build time for arm platforms on x86. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 816bdd3c3..1d9f3f9e6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ ARG NUSQLITE3_DIR="/usr/local/lib/nusqlite3" ARG NUSQLITE3_PATH="${NUSQLITE3_DIR}/libnusqlite3.so" ### STAGE 0: Build client ### -FROM node:20-alpine AS build-client +FROM --platform=$BUILDPLATFORM node:20-alpine AS build-client WORKDIR /client COPY /client /client From df01e517a8cb8a9f11a0aee653e8a079cc6fd0c7 Mon Sep 17 00:00:00 2001 From: Josua Mayer Date: Wed, 3 Sep 2025 15:20:11 +0200 Subject: [PATCH 2/4] Add armv7 support to docker builds Update package.json and Dockerfile to support the armv7 platform. Similar to arm64 it is supported by docker's buildkit and uses an architecture-specific nusqlite3 binary. --- Dockerfile | 2 ++ package.json | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1d9f3f9e6..52447c615 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,6 +33,8 @@ RUN case "$TARGETPLATFORM" in \ curl -L -o /tmp/library.zip "https://github.com/mikiher/nunicode-sqlite/releases/download/v1.2/libnusqlite3-linux-musl-x64.zip" ;; \ "linux/arm64") \ curl -L -o /tmp/library.zip "https://github.com/mikiher/nunicode-sqlite/releases/download/v1.2/libnusqlite3-linux-musl-arm64.zip" ;; \ + "linux/arm/v7") \ + curl -L -o /tmp/library.zip "https://github.com/mikiher/nunicode-sqlite/releases/download/v1.2/libnusqlite3-linux-musl-armv7l.zip" ;; \ *) echo "Unsupported platform: $TARGETPLATFORM" && exit 1 ;; \ esac && \ unzip /tmp/library.zip -d $NUSQLITE3_DIR && \ diff --git a/package.json b/package.json index 34abc60ef..271a703e6 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,10 @@ "prod": "npm run client && npm ci && node index.js", "build-win": "npm run client && pkg -t node20-win-x64 -o ./dist/win/audiobookshelf -C GZip .", "build-linux": "build/linuxpackager", - "docker": "docker buildx build --platform linux/amd64,linux/arm64 --push . -t advplyr/audiobookshelf", + "docker": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --push . -t advplyr/audiobookshelf", "docker-amd64-local": "docker buildx build --platform linux/amd64 --load . -t advplyr/audiobookshelf-amd64-local", "docker-arm64-local": "docker buildx build --platform linux/arm64 --load . -t advplyr/audiobookshelf-arm64-local", + "docker-armv7-local": "docker buildx build --platform linux/arm/v7 --load . -t advplyr/audiobookshelf-arm64-local", "deploy-linux": "node deploy/linux", "test": "mocha", "coverage": "nyc mocha" From 763a9ef9e96eaf61b03267a0b285c041e3dfd09c Mon Sep 17 00:00:00 2001 From: Josua Mayer Date: Wed, 3 Sep 2025 16:03:44 +0200 Subject: [PATCH 3/4] Add py3-setuptools dependency for docker build-server step docker build-server step can fail with errors below, requiring setuptools module installed: 35 120.7 npm error code 1 35 120.7 npm error path /server/node_modules/sqlite3 35 120.7 npm error command failed 35 120.7 npm error command sh -c prebuild-install -r napi || node-gyp rebuild 35 120.7 npm error prebuild-install warn install No prebuilt binaries found (target=6 runtime=napi arch=arm libc=musl platform=linux) 35 120.7 npm error gyp info it worked if it ends with ok 35 120.7 npm error gyp info using node-gyp@8.4.1 35 120.7 npm error gyp info using node@20.19.4 | linux | arm 35 120.7 npm error gyp info find Python using Python version 3.12.11 found at "/usr/bin/python3" 35 120.7 npm error gyp http GET https://nodejs.org/download/release/v20.19.4/node-v20.19.4-headers.tar.gz 35 120.7 npm error gyp http 200 https://nodejs.org/download/release/v20.19.4/node-v20.19.4-headers.tar.gz 35 120.7 npm error gyp http GET https://nodejs.org/download/release/v20.19.4/SHASUMS256.txt 35 120.7 npm error gyp http 200 https://nodejs.org/download/release/v20.19.4/SHASUMS256.txt 35 120.7 npm error gyp info spawn /usr/bin/python3 35 120.7 npm error gyp info spawn args [ 35 120.7 npm error gyp info spawn args '/server/node_modules/node-gyp/gyp/gyp_main.py', 35 120.7 npm error gyp info spawn args 'binding.gyp', 35 120.7 npm error gyp info spawn args '-f', 35 120.7 npm error gyp info spawn args 'make', 35 120.7 npm error gyp info spawn args '-I', 35 120.7 npm error gyp info spawn args '/server/node_modules/sqlite3/build/config.gypi', 35 120.7 npm error gyp info spawn args '-I', 35 120.7 npm error gyp info spawn args '/server/node_modules/node-gyp/addon.gypi', 35 120.7 npm error gyp info spawn args '-I', 35 120.7 npm error gyp info spawn args '/root/.cache/node-gyp/20.19.4/include/node/common.gypi', 35 120.7 npm error gyp info spawn args '-Dlibrary=shared_library', 35 120.7 npm error gyp info spawn args '-Dvisibility=default', 35 120.7 npm error gyp info spawn args '-Dnode_root_dir=/root/.cache/node-gyp/20.19.4', 35 120.7 npm error gyp info spawn args '-Dnode_gyp_dir=/server/node_modules/node-gyp', 35 120.7 npm error gyp info spawn args '-Dnode_lib_file=/root/.cache/node-gyp/20.19.4/<(target_arch)/node.lib', 35 120.7 npm error gyp info spawn args '-Dmodule_root_dir=/server/node_modules/sqlite3', 35 120.7 npm error gyp info spawn args '-Dnode_engine=v8', 35 120.7 npm error gyp info spawn args '--depth=.', 35 120.7 npm error gyp info spawn args '--no-parallel', 35 120.7 npm error gyp info spawn args '--generator-output', 35 120.7 npm error gyp info spawn args 'build', 35 120.7 npm error gyp info spawn args '-Goutput_dir=.' 35 120.7 npm error gyp info spawn args ] 35 120.7 npm error Traceback (most recent call last): 35 120.7 npm error File "/server/node_modules/node-gyp/gyp/gyp_main.py", line 42, in 35 120.7 npm error import gyp # noqa: E402 35 120.7 npm error ^^^^^^^^^^ 35 120.7 npm error File "/server/node_modules/node-gyp/gyp/pylib/gyp/__init__.py", line 9, in 35 120.7 npm error import gyp.input 35 120.7 npm error File "/server/node_modules/node-gyp/gyp/pylib/gyp/input.py", line 19, in 35 120.7 npm error from distutils.version import StrictVersion 35 120.7 npm error ModuleNotFoundError: No module named 'distutils' --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 52447c615..ecd03c8a5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,6 +21,7 @@ RUN apk add --no-cache --update \ curl \ make \ python3 \ + py3-setuptools \ g++ \ unzip From 145de4700cbfde2bd008ae997926dff8f13a6739 Mon Sep 17 00:00:00 2001 From: Josua Mayer Date: Wed, 3 Sep 2025 15:45:20 +0200 Subject: [PATCH 4/4] Add docker armv7 platform to CI Generate docker images for armv7 platform with CI. --- .github/workflows/docker-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index fdb57fbc5..5fdb566d0 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -71,7 +71,7 @@ jobs: tags: ${{ github.event.inputs.tags || steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} context: . - platforms: linux/amd64,linux/arm64 + platforms: linux/amd64,linux/arm64,linux/arm/v7 push: true cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max