fix(docker): fix EACCES on runtime data dir
- add docker-entrypoint.sh that creates and chowns /app/data at startup - run as nextjs via su-exec after fixing directory ownership - handle root-owned named volumes created by earlier images
This commit is contained in:
3 files changed
+29
-1
No files matched your search
+9
-1
@@ -32,7 +32,15 @@ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
||||
RUN mkdir -p /app/data/prototypes \
|
||||
&& chown -R nextjs:nodejs /app/data
|
||||
|
||||
USER nextjs
|
||||
# The entrypoint runs as root at startup so it can fix ownership of
|
||||
# /app/data even when it is a volume created by an earlier image,
|
||||
# then drops to the unprivileged `nextjs` user via su-exec.
|
||||
RUN apk add --no-cache su-exec
|
||||
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
|
||||
RUN sed -i 's/\r$//' /usr/local/bin/docker-entrypoint.sh \
|
||||
&& chmod +x /usr/local/bin/docker-entrypoint.sh
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
CMD ["node", "server.js"]
|
||||
@@ -74,6 +74,10 @@ Notes:
|
||||
|
||||
- Image uses Next.js `output: "standalone"` and `pnpm` in multi-stage build.
|
||||
- Runtime data is written to `/app/data/prototypes`; mount a volume to persist uploads.
|
||||
- A `docker-entrypoint.sh` runs as root at container start, ensures `/app/data/prototypes`
|
||||
exists and is owned by the app user, then drops to the unprivileged `nextjs` user. This
|
||||
avoids `EACCES` errors even when the volume was created by an earlier image as root —
|
||||
no need to delete the existing volume when upgrading.
|
||||
|
||||
## Upload Requirements
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
# Runs as root at container start. Ensures the runtime data directory
|
||||
# exists and is owned by the app user, then drops privileges and runs
|
||||
# the app. This fixes the case where /app/data is a named/bind volume
|
||||
# created by an earlier image and therefore owned by root (EACCES on
|
||||
# mkdir /app/data/prototypes).
|
||||
|
||||
if [ "$(id -u)" -eq 0 ]; then
|
||||
mkdir -p /app/data/prototypes
|
||||
chown -R nextjs:nodejs /app/data
|
||||
exec su-exec nextjs:nodejs "$@"
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
Reference in new issue
Block a user