# -------- # STAGE: base runtime con Node e strumenti minimi # -------- FROM node:20-bookworm-slim AS runtime-base # Impostazioni ambiente e sicurezza build ENV DEBIAN_FRONTEND=noninteractive \ PIP_NO_CACHE_DIR=1 \ PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ NODE_ENV=production # Aggiorna e installa Python + strumenti # Nota: build-essential utile per pacchetti Python nativi (puoi rimuoverlo se non necessario) RUN apt-get update && apt-get install -y --no-install-recommends \ python3 python3-venv python3-pip \ ca-certificates curl tini \ build-essential \ && rm -rf /var/lib/apt/lists/* # Workdir applicazione WORKDIR /usr/src/app # Crea utente non-root e cartelle #RUN useradd -m -u 10001 appuser \ # && mkdir -p /usr/src/app \ # && chown -R appuser:appuser /usr/src/app # -------- # STAGE: dipendenze Node # -------- FROM runtime-base AS node-deps WORKDIR /usr/src/app #copia tutto COPY . . COPY downloadsite-docker.sh downloadsite.sh # Installa packages e dipendenze RUN npm ci --only=production # -------- # STAGE: dipendenze Python (venv) # -------- FROM node-deps AS python-deps WORKDIR /usr/src/app # crea venv RUN python3 -m venv /opt/pyenv \ && /opt/pyenv/bin/pip install --upgrade pip \ && /opt/pyenv/bin/pip install -r requirements.txt # -------- # STAGE: final image # -------- FROM python-deps AS final # Riduci ulteriormente l'immagine togliendo strumenti di build se li avevi installati # (In questo esempio li teniamo per eventuali run-time native libs; opzionale rimuoverli con apt-get purge) WORKDIR /usr/src/app # Imposta PATH per usare il venv e crea symlink "python3" puntato al venv ENV PATH="/opt/pyenv/bin:${PATH}" ENV PATH="/usr/src/app:${PATH}" # Symlink esplicito utile se il tuo codice chiama "python3" hard-coded RUN ln -sf /opt/pyenv/bin/python /usr/local/bin/python3 # Sicurezza: esegui come utente non-root #USER appuser # Espone la porta dell'Express server EXPOSE 3600 # Healthcheck semplice sulla root #HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ # CMD curl -fsS http://localhost:3000/ || exit 1 # Usa tini come init per gestire segnali e orphan processes ENTRYPOINT ["/usr/bin/tini", "--"] # Avvio CMD ["node", "server_docker.js"]