multi_static_website/Dockerfile
2025-12-23 13:06:25 +01:00

86 lines
2.3 KiB
Docker

# --------
# 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"]