FROM node:20-slim RUN apt-get update \ && apt-get install -y curl git graphicsmagick inotify-tools jq \ && apt-get clean && rm -rf /var/lib/apt/lists/* \ && mkdir -p /opt/inventaire /opt/inventaire_leveldb /opt/inventaire_local_media_storage /opt/inventaire_backups \ && chown -R 1000:1000 /opt # Default to the same user as the host (override from command line if needed) # Known benefits: # - allows to handle leveldb with level-party from both the host and container at the same time USER 1000:1000 WORKDIR /opt/inventaire ARG GIT_REF=main ENV DOCKER=1 # - Create the client directory to prevent the server postinstall to run `npm run install-client` as it does it with the wrong workdir and env # - Create the public/sitemaps directory to prevent the client postinstall to run `npm run generate-sitemaps` (which needs to be updated to support non-inventaire.io instances) RUN git clone https://git.inventaire.io/inventaire --depth 1 --branch "${GIT_REF}" . \ && mkdir -p /opt/inventaire/client \ && npm ci --omit=dev \ && npm run build \ && git clone https://git.inventaire.io/inventaire-client ./client --branch docker --depth 1 --branch "${GIT_REF}" \ && mkdir -p /opt/inventaire/client/public/sitemaps WORKDIR /opt/inventaire/client # Include dev dependencies (webpack, svelte-checks) at first to be able to build during the postinstall script RUN npm ci --include=dev \ && rm -rf node_modules \ && npm ci --omit=dev --ignore-scripts \ && npm cache clean --force COPY docker-entrypoint.sh /opt/docker-entrypoint.sh WORKDIR /opt/inventaire # Avoid using npm script to start the server # See https://adambrodziak.pl/dockerfile-good-practices-for-node-and-npm#heading-use-node-not-npm-to-start-the-server ENTRYPOINT [ "/opt/docker-entrypoint.sh" ]