# 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" # capnproto FROM agnos-compiler AS agnos-compiler-capnp COPY ./userspace/compile-capnp.sh /tmp/agnos/ RUN --mount=type=cache,target=/root/.ccache,id=capnp,sharing=shared \ /tmp/agnos/compile-capnp.sh # ffmpeg FROM agnos-compiler AS agnos-compiler-ffmpeg COPY ./userspace/compile-ffmpeg.sh /tmp/agnos/ RUN --mount=type=cache,target=/root/.ccache,id=ffmpeg,sharing=shared \ /tmp/agnos/compile-ffmpeg.sh # 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 # lpac FROM agnos-compiler-libqmi AS agnos-compiler-lpac COPY ./userspace/compile-lpac.sh /tmp/agnos/ RUN --mount=type=cache,target=/root/.ccache,id=lpac,sharing=shared \ /tmp/agnos/compile-lpac.sh # qtwayland5 FROM agnos-compiler AS agnos-compiler-qtwayland5 COPY ./userspace/qtwayland/*.deb /tmp/agnos/ COPY ./userspace/compile-qtwayland5.sh /tmp/agnos/ COPY ./userspace/qtwayland/patch* /tmp/agnos/ RUN --mount=type=cache,target=/root/.ccache,id=qtwayland5,sharing=shared \ /tmp/agnos/compile-qtwayland5.sh # ################## # # ###### 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 # Install old Qt 5.12.8, libwayland 1.9.0-1 and deps COPY ./userspace/qtwayland/*.deb /tmp/agnos/ RUN apt-get -o Dpkg::Options::="--force-overwrite" install -yq \ /tmp/agnos/qt-5.12.8.deb \ /tmp/agnos/libwayland-1.9.0-1.deb \ /tmp/agnos/libicu66_66.1-2ubuntu2.1_arm64.deb \ /tmp/agnos/libssl1.1_1.1.1f-1ubuntu2.22_arm64.deb \ /tmp/agnos/libffi6_3.2.1-8_arm64.deb # ################### # # ###### AGNOS ###### # # ################### # FROM agnos-base # Hardware setup RUN mkdir -p /tmp/agnos/debs COPY ./userspace/debs /tmp/agnos/debs COPY ./userspace/hardware_setup.sh /tmp/agnos RUN /tmp/agnos/hardware_setup.sh RUN mv /data/persist /system/ && rm -rf /data/* COPY --from=agnos-compiler-libqmi /tmp/libqmi.deb /tmp/ COPY --from=agnos-compiler-modemmanager /tmp/modemmanager.deb /tmp/ COPY --from=agnos-compiler-lpac /tmp/lpac.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 \ 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 && \ apt-get -o Dpkg::Options::="--force-overwrite" install -yq ./lpac.deb # Pre-compiled capnp (must be before python install) COPY --from=agnos-compiler-capnp /tmp/capnproto.deb /tmp/capnproto.deb RUN cd /tmp && apt-get -o Dpkg::Options::="--force-overwrite" install -yq ./capnproto.deb # Use other pre-compiled packages COPY --from=agnos-compiler-ffmpeg /tmp/ffmpeg.deb /tmp/ffmpeg.deb RUN cd /tmp && apt-get -o Dpkg::Options::="--force-overwrite" install -yq ./ffmpeg.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 && \ export PYOPENCL_CL_PRETEND_VERSION="2.0" && \ 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 COPY --from=agnos-compiler-qtwayland5 /tmp/qtwayland5.deb /tmp/qtwayland5.deb RUN cd /tmp && apt-get -o Dpkg::Options::="--force-overwrite" install -yq --allow-downgrades ./qtwayland5.deb # Patched libeglSubDriverWayland with fixed nullptr deref in CommitBuffer COPY ./userspace/files/libeglSubDriverWayland.so.patched /lib/aarch64-linux-gnu/libeglSubDriverWayland.so COPY ./userspace/home/ /home/$USERNAME/ COPY ./userspace/home/.config/ /root/.config RUN chown -R $USERNAME: /home/$USERNAME/.config # populate /lib COPY ./userspace/files/*.path /lib/systemd/system/ COPY ./userspace/files/*.mount /lib/systemd/system/ COPY ./userspace/files/*.service /lib/systemd/system/ COPY ./userspace/files/*.timer /lib/systemd/system/ COPY ./userspace/files/serial-getty@ttyMSM0_override.conf /lib/systemd/system/serial-getty@ttyMSM0.service.d/serial-getty@ttyMSM0_override.conf COPY ./userspace/files/ssh_override.conf /lib/systemd/system/ssh.service.d/override.conf COPY ./userspace/firmware/* /lib/firmware/ # populate /etc COPY ./userspace/files/fstab /etc COPY ./userspace/files/profile /etc/profile COPY ./userspace/files/comma-polkit.rules /etc/polkit-1/rules.d/ COPY ./userspace/files/*.rules /etc/udev/rules.d/ COPY ./userspace/files/ssh*_config /etc/ssh/ COPY ./userspace/files/logrotate.conf /etc/ COPY ./userspace/files/rsyslog /etc/logrotate.d/ RUN chmod 644 /etc/logrotate.conf RUN touch -r /lib/systemd/systemd /etc/fstab # populate /usr COPY ./userspace/usr/comma/ /usr/$USERNAME/ COPY ./userspace/usr/share/fonts/* /usr/share/fonts/ COPY ./userspace/libs/* /usr/lib/aarch64-linux-gnu/ COPY ./userspace/libs32/* /usr/lib/arm-linux-gnueabihf/ # this is big, only enable when we need it # kernel headers for the AGNOS kernel (built on device) #COPY ./userspace/files/linux-headers-4.9.103+_4.9.103+-1_arm64.deb /tmp/ #RUN dpkg -i /tmp/linux-headers-4.9.103+_4.9.103+-1_arm64.deb # Weston with hacked touch rotate and color correction COPY ./userspace/files/weston /usr/bin/weston COPY ./userspace/files/gl-renderer.so /usr/lib/arm-linux-gnueabihf/weston # 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/motd/* /etc/update-motd.d/ # Let NetworkManager manage eth0 COPY ./userspace/files/10-globally-managed-devices.conf /etc/NetworkManager/conf.d/10-globally-managed-devices.conf COPY ./userspace/files/NetworkManager.conf /etc/NetworkManager/NetworkManager.conf # Add cellular connections COPY ./userspace/files/*.nmconnection /usr/lib/NetworkManager/system-connections/ RUN chmod 600 /usr/lib/NetworkManager/system-connections/*.nmconnection # Prefer ipv4 over ipv6 RUN echo "precedence ::ffff:0:0/96 100" >> /etc/gai.conf # Don't let logind delete /dev/shm COPY ./userspace/files/logind.conf /etc/systemd/logind.conf # Copy Avahi daemon override COPY ./userspace/files/avahi-override.conf /etc/systemd/system/avahi-daemon.service.d/override.conf # Prevent polkitd memory leak from getting out of hand by restarting it every ~day COPY ./userspace/files/polkit-override.conf /etc/systemd/system/polkit.service.d/override.conf # Remove qt network bearer plugins RUN rm -rf /usr/lib/aarch64-linux-gnu/qt5/plugins/bearer # Add iptable rules to block incoming traffic on wwan0 COPY ./userspace/etc/iptables/rules.v4 /etc/iptables/rules.v4 # 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 # Copy extra FW, rest comes from debs COPY ./userspace/files/CAMERA_ICP.elf /usr/lib/firmware # Setup hostname resolution for our custom hostname RUN sed -i 's/hosts: files dns myhostname/hosts: files myhostname dns/g' /etc/nsswitch.conf # TODO: move this to base_setup.sh or build gcc from source # Remove unused architectures & bins from arm-none-eabi RUN cd /usr/lib/gcc/arm-none-eabi/* && \ rm -rf arm/ && \ find thumb/ -maxdepth 1 -type d ! \( -name 'thumb' -o -name 'v7e-m+fp' -o -name 'v7e-m+dp' \) -exec rm -rf {} + && \ rm cc1plus g++-mapper-server && \ find /usr/bin -maxdepth 1 -type f -name 'arm-none-eabi-*' ! \( -name 'arm-none-eabi-gcc' -o -name 'arm-none-eabi-objcopy' -o -name 'arm-none-eabi-objdump' \) -delete # 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