towerops/k8s/Dockerfile.base
2026-07-16 07:54:28 -05:00

62 lines
2.7 KiB
Text

# syntax=docker/dockerfile:1.6
#
# Pre-built runtime base image for the Towerops Phoenix app. Contains:
# * Debian trixie-slim with locale set to en_US.UTF-8
# * Runtime apt deps for the BEAM + Erlang ssl + snmp
# * `gdal-bin` (~500 MB dep tree, the slowest install) for the LIDAR
# elevation reader
#
# Built by `.forgejo/workflows/build-base.yaml` only when this file or
# the workflow changes. The app `Dockerfile` does
# `FROM codeberg.org/gmcintire/towerops-base:latest` so everyday code
# pushes skip the gdal + snmp apt install entirely.
#
# Bumping the Debian release: change the ARG below and push — the base
# workflow rebuilds and re-tags `:latest`. The app Dockerfile follows
# `:latest`, so the next app push picks it up automatically.
ARG DEBIAN_VERSION=trixie-20260713-slim
ARG RUNNER_IMAGE="docker.io/debian:${DEBIAN_VERSION}"
FROM ${RUNNER_IMAGE} AS base
# Weekly cron passes CACHE_BUST=<iso year+week> so the apt layers below
# re-execute and pick up Debian security patches. Source-controlled
# pushes leave the value at its `none` default, so day-to-day base
# rebuilds (Dockerfile.base edits) don't pay the apt-update cost
# unless the week has rolled over.
#
# Note: the registry occasionally GCs base-image blobs that the
# manifest still references. When that happens, push any change to
# this file (or run the workflow via workflow_dispatch) to re-trigger
# the build-base workflow and re-upload the layers.
ARG CACHE_BUST=none
# Runtime apt deps for the BEAM + ICU/locale + ping + SNMP + GDAL.
# gdal-bin is split into a second RUN so a transient gdal install
# failure doesn't invalidate the smaller base layer above. Referencing
# `${CACHE_BUST}` in the RUN line changes the layer hash week-to-week
# without altering the install set.
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
echo "cache-bust=${CACHE_BUST}" \
&& rm -f /etc/apt/apt.conf.d/docker-clean \
&& apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get upgrade -y \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
libstdc++6 openssl libncurses6 locales ca-certificates iputils-ping \
snmp libsnmp40
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
echo "cache-bust=${CACHE_BUST}" \
&& rm -f /etc/apt/apt.conf.d/docker-clean \
&& apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends gdal-bin
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen \
&& locale-gen
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US:en
ENV LC_ALL=en_US.UTF-8