mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-07-07 09:51:37 +00:00
Introduces a robust entrypoint script and 'gosu' to allow users to specify Process User ID (PUID) and Process Group ID (PGID) via environment variables. This resolves permission errors encountered when binding host volumes into the container, as the entrypoint script now runs 'chown' on /config and /metadata as root before dropping privileges and running the application. - Adds 'gosu' dependency to the runtime stage. - Implements 'docker-entrypoint.sh' to handle user switching and permission fixing. - Updates ENTRYPOINT to use the wrapper script, passing CMD as arguments.
80 lines
2 KiB
Docker
80 lines
2 KiB
Docker
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
|
|
|
|
WORKDIR /client
|
|
COPY /client /client
|
|
RUN npm ci && npm cache clean --force
|
|
RUN npm run generate
|
|
|
|
### STAGE 1: Build server ###
|
|
FROM node:20-alpine AS build-server
|
|
|
|
ARG NUSQLITE3_DIR
|
|
ARG TARGETPLATFORM
|
|
|
|
ENV NODE_ENV=production
|
|
|
|
RUN apk add --no-cache --update \
|
|
curl \
|
|
make \
|
|
python3 \
|
|
g++ \
|
|
unzip
|
|
|
|
WORKDIR /server
|
|
COPY index.js package* /server
|
|
COPY /server /server/server
|
|
|
|
RUN case "$TARGETPLATFORM" in \
|
|
"linux/amd64") \
|
|
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" ;; \
|
|
*) echo "Unsupported platform: $TARGETPLATFORM" && exit 1 ;; \
|
|
esac && \
|
|
unzip /tmp/library.zip -d $NUSQLITE3_DIR && \
|
|
rm /tmp/library.zip
|
|
|
|
RUN npm ci --only=production
|
|
|
|
### STAGE 2: Create minimal runtime image ###
|
|
FROM node:20-alpine
|
|
|
|
ARG NUSQLITE3_DIR
|
|
ARG NUSQLITE3_PATH
|
|
|
|
# Install only runtime dependencies
|
|
RUN apk add --no-cache --update \
|
|
tzdata \
|
|
ffmpeg \
|
|
tini \
|
|
gosu
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy compiled frontend and server from build stages
|
|
COPY --from=build-client /client/dist /app/client/dist
|
|
COPY --from=build-server /server /app
|
|
COPY --from=build-server ${NUSQLITE3_PATH} ${NUSQLITE3_PATH}
|
|
|
|
# Copy Entry script and add execute permissions.
|
|
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
|
|
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
|
|
|
|
EXPOSE 80
|
|
|
|
ENV PORT=80
|
|
ENV NODE_ENV=production
|
|
ENV CONFIG_PATH="/config"
|
|
ENV METADATA_PATH="/metadata"
|
|
ENV SOURCE="docker"
|
|
ENV NUSQLITE3_DIR=${NUSQLITE3_DIR}
|
|
ENV NUSQLITE3_PATH=${NUSQLITE3_PATH}
|
|
|
|
# Call entrypoint script instead of just tini.
|
|
ENTRYPOINT ["tini", "--", "/usr/local/bin/docker-entrypoint.sh"]
|
|
# This becomes the argument ($@) for the entrypoint script
|
|
CMD ["node", "index.js"]
|