Files
agnos-builder/Dockerfile.agnos
2026-04-30 19:10:30 -07:00

187 lines
5.5 KiB
Docker

# check=error=true
# ################## #
# ### Package ##### #
# ### Compilation ## #
# ################## #
FROM ubuntu:24.04 AS agnos-compiler
# Common packages
RUN apt-get update && apt-get install -yq --no-install-recommends \
build-essential \
ca-certificates \
ccache \
clang \
curl \
checkinstall \
git \
pkg-config \
wget
# Enable ccache
ENV PATH="/usr/lib/ccache:$PATH"
# libqmi
FROM agnos-compiler AS agnos-compiler-libqmi
COPY ./userspace/compile-libqmi.sh /tmp/agnos/
RUN --mount=type=cache,target=/root/.ccache,id=libqmi,sharing=shared \
/tmp/agnos/compile-libqmi.sh
# ModemManager
FROM agnos-compiler-libqmi AS agnos-compiler-modemmanager
COPY ./userspace/compile-modemmanager.sh /tmp/agnos/
RUN --mount=type=cache,target=/root/.ccache,id=modemmanager,sharing=shared \
/tmp/agnos/compile-modemmanager.sh
# power_burn_max
FROM agnos-compiler AS agnos-compiler-power-burn
RUN apt-get update && apt-get install -yq --no-install-recommends \
opencl-c-headers
COPY ./userspace/root/usr/lib/aarch64-linux-gnu/libOpenCL.so* /usr/lib/aarch64-linux-gnu/
COPY ./userspace/root/usr/lib/aarch64-linux-gnu/libcutils.so* /usr/lib/aarch64-linux-gnu/
COPY ./userspace/root/usr/lib/aarch64-linux-gnu/liblog.so* /usr/lib/aarch64-linux-gnu/
COPY ./userspace/power_burn_max.c /tmp/agnos/
RUN gcc -O2 -o /tmp/power_burn_max /tmp/agnos/power_burn_max.c \
-lOpenCL -lpthread -ldl
# ################## #
# ###### Base ###### #
# ################## #
FROM scratch AS agnos-base
# Add Ubuntu Base image files
ARG UBUNTU_BASE_IMAGE
ADD ${UBUNTU_BASE_IMAGE} /
# Build folder
RUN mkdir -p /tmp/agnos
# Stop on error
RUN set -xe
ARG USERNAME=comma
# Base system setup
RUN echo "resolvconf resolvconf/linkify-resolvconf boolean false" | debconf-set-selections
COPY ./userspace/base_setup.sh /tmp/agnos
RUN /tmp/agnos/base_setup.sh
# Install openpilot dependencies
COPY ./userspace/openpilot_dependencies.sh /tmp/agnos/
RUN /tmp/agnos/openpilot_dependencies.sh
COPY ./userspace/openpilot_python_dependencies.sh /tmp/agnos/
RUN /tmp/agnos/openpilot_python_dependencies.sh
# ################### #
# ###### AGNOS ###### #
# ################### #
FROM agnos-base
# Hardware rootfs overlay
COPY ./userspace/root/etc/ /etc/
COPY ./userspace/root/lib/ /usr/lib/
COPY ./userspace/root/home/ /home/
COPY ./userspace/root/sbin/ /usr/sbin/
COPY ./userspace/root/system/ /system/
COPY ./userspace/root/usr/ /usr/
RUN mkdir -p /dsp /firmware /persist /data /cache /rwtmp
COPY --from=agnos-compiler-libqmi /tmp/libqmi.deb /tmp/
COPY --from=agnos-compiler-modemmanager /tmp/modemmanager.deb /tmp/
RUN cd /tmp && \
apt-get update && \
apt-get install -yq --no-install-recommends \
python3 \
python3-dev \
gir1.2-qmi-1.0 \
libglib2.0-dev \
libqmi-glib5 \
libc6 \
libglib2.0-0t64 \
libgudev-1.0-0 \
libmm-glib0 \
libpolkit-gobject-1-0 \
libsystemd0 \
libwayland-client0 \
libwayland-server0 \
polkitd \
mobile-broadband-provider-info && \
apt-get -o Dpkg::Options::="--force-overwrite" install -yq ./libqmi.deb && \
apt-get -o Dpkg::Options::="--force-overwrite" install -yq ./modemmanager.deb
ARG XDG_DATA_HOME="/usr/local"
# Install openpilot python packages
COPY ./userspace/uv /tmp/agnos/uv
RUN source $XDG_DATA_HOME/venv/bin/activate && \
cd /tmp/agnos/uv && \
MAKEFLAGS="-j$(nproc)" UV_NO_CACHE=1 UV_PROJECT_ENVIRONMENT=$XDG_DATA_HOME/venv uv sync --frozen --inexact --compile-bytecode
# Install nice to haves
COPY ./userspace/install_extras.sh /tmp/agnos/
RUN /tmp/agnos/install_extras.sh
RUN chown -R $USERNAME: /home/$USERNAME/.config
RUN rm -rf /root/.config && ln -s /home/$USERNAME/.config /root/.config
RUN chmod 644 /etc/logrotate.conf
RUN touch -r /lib/systemd/systemd /etc/fstab
# Install kernel headers
COPY ./output/linux-headers/include/ /usr/include/
COPY --from=agnos-compiler-power-burn /tmp/power_burn_max /home/$USERNAME/power_burn_max
RUN chown $USERNAME: /home/$USERNAME/power_burn_max
COPY ./userspace/irsc_util.c /tmp/agnos/
RUN gcc -O2 -Wall -Wextra -o /usr/bin/irsc_util /tmp/agnos/irsc_util.c
# Setup systemd services
COPY ./userspace/services.sh /tmp/agnos
RUN /tmp/agnos/services.sh
# MOTD
RUN rm -r /etc/update-motd.d/*
COPY --chown=root:root ./userspace/root/etc/update-motd.d/* /etc/update-motd.d/
RUN chmod 600 /usr/lib/NetworkManager/system-connections/*.nmconnection
# Prefer ipv4 over ipv6
RUN echo "precedence ::ffff:0:0/96 100" >> /etc/gai.conf
# Run ModemManager in debug mode to allow AT commands
COPY ./userspace/files/ModemManager.service /lib/systemd/system/
RUN systemctl enable ModemManager
# Add more T-Mobile networks to mobile-broadband-provider-info (do we still need the package?)
COPY ./userspace/files/serviceproviders.xml /usr/share/mobile-broadband-provider-info/serviceproviders.xml
# Setup hostname resolution for our custom hostname
RUN sed -i 's/hosts: files dns myhostname/hosts: files myhostname dns/g' /etc/nsswitch.conf
# keep this last
RUN ldconfig
# Setup RO rootfs
RUN mkdir -p /rwtmp
RUN mkdir -p /tmptmp
COPY ./userspace/readonly_setup.sh /tmptmp/readonly_setup.sh
RUN /tmptmp/readonly_setup.sh && rm -rf /tmptmp
# copy at the end, after all apt usage
COPY ./userspace/files/apt.conf /etc/apt/apt.conf
# copy version file
COPY VERSION /VERSION
# ################# #
# #### Cleanup #### #
# ################# #
RUN rm -rf /usr/share/icons/* && \
rm -rf /var/lib/apt/lists/* && \
rm -rf /home/$USERNAME/.cache && \
rm -rf /root/.cache && \
apt-get clean