new file: Containerfile new file: README.md new file: compose.yml new file: configuration.py new file: entrypoint.sh new file: local_requirements.txt new file: named.conf new file: nginx.conf new file: rndc.key
100 lines
3.0 KiB
Docker
100 lines
3.0 KiB
Docker
# ============================================================
|
||
# NetBox 4.5 – Python 3.12 / Alpine
|
||
# Custom validators → baked in via COPY
|
||
# Custom scripts → mounted as volume at runtime
|
||
# Plugins & extra deps → baked in via pip
|
||
# configuration.py → mounted as volume at runtime
|
||
# ============================================================
|
||
|
||
# ── Stage 1: build wheel cache ────────────────────────────────
|
||
ARG PYTHON_VERSION
|
||
|
||
FROM python:${PYTHON_VERSION}-alpine AS builder
|
||
|
||
ARG NETBOX_VERSION
|
||
LABEL org.opencontainers.image.version=$NETBOX_VERSION
|
||
|
||
RUN apk update && apk add --no-cache \
|
||
build-base \
|
||
cargo \
|
||
curl \
|
||
git \
|
||
libffi-dev \
|
||
openssl-dev \
|
||
postgresql-dev \
|
||
xmlsec-dev \
|
||
zlib-dev
|
||
|
||
WORKDIR /build
|
||
|
||
# Download NetBox source
|
||
RUN curl -fsSL \
|
||
"https://github.com/netbox-community/netbox/archive/refs/tags/v${NETBOX_VERSION}.tar.gz" \
|
||
| tar -xz --strip-components=1
|
||
|
||
# Install NetBox core requirements
|
||
RUN pip install --upgrade pip && \
|
||
pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt
|
||
|
||
# ── Install plugins & extra deps here ────────────────────────
|
||
COPY local_requirements.txt /build/local_requirements.txt
|
||
RUN pip wheel --no-cache-dir --wheel-dir /wheels -r /build/local_requirements.txt
|
||
|
||
# ── Stage 2: runtime image ────────────────────────────────────
|
||
FROM python:${PYTHON_VERSION}-alpine AS runtime
|
||
|
||
LABEL org.opencontainers.image.title="netbox" \
|
||
org.opencontainers.image.version="${NETBOX_VERSION}" \
|
||
org.opencontainers.image.description="NetBox network source of truth"
|
||
|
||
# Runtime OS deps only (no build tools)
|
||
RUN apk add --no-cache \
|
||
bash \
|
||
curl \
|
||
libffi \
|
||
libpq \
|
||
libxslt \
|
||
openssl \
|
||
xmlsec \
|
||
zlib && \
|
||
addgroup -S netbox && \
|
||
adduser -S -G netbox -h /opt/netbox netbox
|
||
|
||
WORKDIR /opt/netbox
|
||
|
||
# Copy NetBox source from builder
|
||
COPY --from=builder /build .
|
||
|
||
# Install all pre-built wheels (core + plugins)
|
||
COPY --from=builder /wheels /wheels
|
||
RUN pip install --no-cache-dir --no-index --find-links=/wheels /wheels/*.whl && \
|
||
rm -rf /wheels
|
||
|
||
# Create directories NetBox expects to own
|
||
RUN mkdir -p \
|
||
netbox/media \
|
||
netbox/reports \
|
||
netbox/scripts \
|
||
netbox/static && \
|
||
chown -R netbox:netbox /opt/netbox
|
||
|
||
# ── Volume mount points ───────────────────────────────────────
|
||
#
|
||
# /opt/netbox/netbox/netbox/configuration.py
|
||
# → your configuration.py
|
||
#
|
||
# /opt/netbox/netbox/media/
|
||
# → uploaded media (persist across restarts)
|
||
#
|
||
VOLUME ["/opt/netbox/netbox/media"]
|
||
VOLUME ["/opt/netbox/netbox/static"]
|
||
|
||
# Entrypoint script handles: collectstatic, migrate, then gunicorn/worker
|
||
COPY --chown=netbox:netbox ./entrypoint.sh /entrypoint.sh
|
||
RUN chmod +x /entrypoint.sh
|
||
|
||
USER netbox
|
||
|
||
ENTRYPOINT ["/entrypoint.sh"]
|
||
CMD ["gunicorn"]
|