diff --git a/docker/Dockerfile b/docker/Dockerfile index 05399b42b..33e629f23 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -78,10 +78,12 @@ RUN if [ -n "$DEBIAN_MIRROR" ]; then \ apt-get install -y --no-install-recommends \ postgresql-client \ curl \ + gosu \ && rm -rf /var/lib/apt/lists/* # Create non-root user RUN useradd -m -u 1000 powermem && \ + mkdir -p /app/logs && \ chown -R powermem:powermem /app # Copy installed package from builder @@ -96,9 +98,6 @@ COPY --chown=powermem:powermem pyproject.toml ./ COPY --chown=powermem:powermem docker/docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh -# Switch to non-root user -USER powermem - # Expose default port EXPOSE 8848 diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh index c11ecfc89..ef42821be 100644 --- a/docker/docker-entrypoint.sh +++ b/docker/docker-entrypoint.sh @@ -19,6 +19,21 @@ validate_config() { log "Configuration validation completed" } +# Prepare writable paths backed by bind mounts before dropping privileges. +prepare_runtime_directories() { + if [ "$(id -u)" -eq 0 ]; then + mkdir -p /app/logs + chown -R powermem:powermem /app/logs + chmod -R u+rwX /app/logs + return + fi + + if [ ! -d /app/logs ] || [ ! -w /app/logs ]; then + log "Error: /app/logs must be writable by the runtime user" + exit 1 + fi +} + # Main execution main() { log "Starting PowerMem Server..." @@ -37,6 +52,9 @@ main() { # Validate configuration validate_config + + # Bind-mounted directories are commonly created as root on the host. + prepare_runtime_directories # Log configuration (without sensitive data) log "Server Configuration:" @@ -49,9 +67,11 @@ main() { # Execute the command log "Launching server..." + if [ "$(id -u)" -eq 0 ]; then + exec gosu powermem "$@" + fi exec "$@" } # Run main function main "$@" -