From 7bcee648adbfc52e32157dc14ef899a62250bf9f Mon Sep 17 00:00:00 2001 From: paul Date: Wed, 23 Jul 2025 14:32:14 +0200 Subject: [PATCH] fix: Resolve Docker permission issues in development environment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Create dedicated Dockerfile.backend.dev for development with proper permissions - Set user UID/GID to 1000 (common for development systems) - Create logs and temp directories in Dockerfile before switching user - Use named volumes for logs, temp, and node_modules to maintain permissions - Mount only source files instead of entire backend directory - Remove complex entrypoint script in favor of simple CMD - Add LOG_DIR and TEMP_DIR environment variables This fixes the "Permission denied" errors when creating directories in Docker. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- backend/docker-entrypoint.sh | 12 +--------- docker-compose.dev.yml | 20 ++++++++++++----- docker/Dockerfile.backend | 12 ++++------ docker/Dockerfile.backend.dev | 41 +++++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 24 deletions(-) create mode 100644 docker/Dockerfile.backend.dev diff --git a/backend/docker-entrypoint.sh b/backend/docker-entrypoint.sh index d47211a..3d86433 100755 --- a/backend/docker-entrypoint.sh +++ b/backend/docker-entrypoint.sh @@ -1,15 +1,5 @@ #!/bin/sh set -e -# Ensure logs directory exists with correct permissions -if [ ! -d "/app/logs" ]; then - mkdir -p /app/logs -fi - -# Ensure temp directory exists -if [ ! -d "/app/temp" ]; then - mkdir -p /app/temp -fi - # Start the application -exec node src/app.js \ No newline at end of file +exec "$@" \ No newline at end of file diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 26ac24f..691fbd8 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -8,26 +8,30 @@ services: backend: build: context: ./backend - dockerfile: ../docker/Dockerfile.backend + dockerfile: ../docker/Dockerfile.backend.dev container_name: minio-webui-backend-dev restart: unless-stopped environment: NODE_ENV: development PORT: 7510 + LOG_DIR: /app/logs + TEMP_DIR: /app/temp env_file: - .env ports: - "7510:7510" volumes: - - ./backend:/app - - /app/node_modules - - ./logs:/app/logs + - ./backend/src:/app/src + - ./backend/package.json:/app/package.json + - ./backend/package-lock.json:/app/package-lock.json + - backend-logs:/app/logs + - backend-temp:/app/temp + - backend-node-modules:/app/node_modules - ~/.mc:/home/nodejs/.mc:ro depends_on: - redis networks: - minio-webui-network - command: npm run dev frontend: build: @@ -68,6 +72,12 @@ services: volumes: redis-data: driver: local + backend-logs: + driver: local + backend-temp: + driver: local + backend-node-modules: + driver: local networks: minio-webui-network: diff --git a/docker/Dockerfile.backend b/docker/Dockerfile.backend index 0c1337b..e3c983b 100644 --- a/docker/Dockerfile.backend +++ b/docker/Dockerfile.backend @@ -21,14 +21,10 @@ COPY . . RUN addgroup -g 1001 -S nodejs && \ adduser -S nodejs -u 1001 -# Create logs directory with proper permissions -RUN mkdir -p logs && \ +# Create necessary directories with proper permissions +RUN mkdir -p logs temp && \ chown -R nodejs:nodejs /app && \ - chmod 755 logs - -# Copy and set permissions for entrypoint -COPY docker-entrypoint.sh /usr/local/bin/ -RUN chmod +x /usr/local/bin/docker-entrypoint.sh + chmod 755 logs temp # Switch to non-root user USER nodejs @@ -37,4 +33,4 @@ USER nodejs EXPOSE 3000 # Start the application -ENTRYPOINT ["docker-entrypoint.sh"] \ No newline at end of file +CMD ["node", "src/app.js"] \ No newline at end of file diff --git a/docker/Dockerfile.backend.dev b/docker/Dockerfile.backend.dev new file mode 100644 index 0000000..3e1c12f --- /dev/null +++ b/docker/Dockerfile.backend.dev @@ -0,0 +1,41 @@ +FROM node:20-alpine + +# Install MinIO client +RUN wget https://dl.min.io/client/mc/release/linux-amd64/mc && \ + chmod +x mc && \ + mv mc /usr/local/bin/ + +# Install development dependencies +RUN apk add --no-cache bash + +# Create app directory +WORKDIR /app + +# Create non-root user (same UID/GID as most development systems) +RUN addgroup -g 1000 -S nodejs && \ + adduser -S nodejs -u 1000 -G nodejs + +# Copy package files +COPY package*.json ./ + +# Install dependencies as root +RUN npm install + +# Create necessary directories +RUN mkdir -p logs temp && \ + chmod 755 logs temp + +# Copy application files +COPY . . + +# Change ownership of everything to nodejs user +RUN chown -R nodejs:nodejs /app + +# Switch to non-root user +USER nodejs + +# Expose port +EXPOSE 7510 + +# Start the application in development mode +CMD ["npm", "run", "dev"] \ No newline at end of file