ARG NQPTP_BRANCH=main ARG SHAIRPORT_SYNC_BRANCH=. FROM alpine:3.20 AS builder RUN apk -U add \ alsa-lib-dev \ autoconf \ automake \ avahi-dev \ build-base \ dbus \ ffmpeg-dev \ git \ libconfig-dev \ libgcrypt-dev \ libplist-dev \ libressl-dev \ libsndfile-dev \ libsodium-dev \ libtool \ pipewire-dev \ mosquitto-dev \ popt-dev \ pulseaudio-dev \ soxr-dev \ xxd ##### ALAC ##### FROM builder AS alac RUN git clone --depth=1 https://github.com/mikebrady/alac WORKDIR /alac RUN autoreconf -i RUN ./configure RUN make -j $(nproc) RUN make install WORKDIR / ##### ALAC END ##### ##### NQPTP ##### FROM builder AS nqptp ARG NQPTP_BRANCH RUN git clone --depth=1 -b "$NQPTP_BRANCH" https://github.com/mikebrady/nqptp WORKDIR /nqptp RUN autoreconf -i RUN ./configure RUN make -j $(nproc) WORKDIR / ##### NQPTP END ##### ##### SPS ##### # Note: apple-alac requires alac build first. FROM alac AS shairport-sync ARG SHAIRPORT_SYNC_BRANCH WORKDIR /shairport-sync COPY . . RUN git checkout "$SHAIRPORT_SYNC_BRANCH" WORKDIR /shairport-sync/build RUN autoreconf -i ../ RUN CFLAGS="-O3" CXXFLAGS="-O3" ../configure --sysconfdir=/etc --with-alsa --with-pa --with-soxr --with-avahi --with-ssl=openssl \ --with-airplay-2 --with-metadata --with-dummy --with-pipe --with-dbus-interface \ --with-stdout --with-mpris-interface --with-mqtt-client \ --with-apple-alac --with-convolution --with-pw RUN make -j $(nproc) RUN DESTDIR=install make install WORKDIR / ##### SPS END ##### ##### STATIC FILES ##### FROM scratch AS files # Add run script that will start SPS COPY --chmod=755 ./docker/run.sh ./run.sh COPY ./docker/etc/s6-overlay/s6-rc.d /etc/s6-overlay/s6-rc.d COPY ./docker/etc/pulse /etc/pulse ##### END STATIC FILES ##### ##### BUILD FILES ##### FROM scratch AS build-files COPY --from=shairport-sync /shairport-sync/build/install/usr/local/bin/shairport-sync /usr/local/bin/shairport-sync COPY --from=shairport-sync /shairport-sync/build/install/usr/local/share/man/man1 /usr/share/man/man1 COPY --from=nqptp /nqptp/nqptp /usr/local/bin/nqptp COPY --from=alac /usr/local/lib/libalac.* /usr/local/lib/ COPY --from=shairport-sync /shairport-sync/build/install/etc/shairport-sync.conf /etc/ COPY --from=shairport-sync /shairport-sync/build/install/etc/shairport-sync.conf.sample /etc/ COPY --from=shairport-sync /shairport-sync/build/install/etc/dbus-1/system.d/shairport-sync-dbus.conf /etc/dbus-1/system.d/ COPY --from=shairport-sync /shairport-sync/build/install/etc/dbus-1/system.d/shairport-sync-mpris.conf /etc/dbus-1/system.d/ ##### END BUILD FILES ##### # Shairport Sync Runtime System FROM crazymax/alpine-s6:3.20-3.2.0.2 ENV S6_CMD_WAIT_FOR_SERVICES=1 ENV S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 RUN apk -U add \ alsa-lib \ avahi \ avahi-tools \ dbus \ ffmpeg \ glib \ less \ less-doc \ libconfig \ libgcrypt \ libplist \ libpulse \ libressl3.8-libcrypto \ libsndfile \ libsodium \ libuuid \ pipewire \ man-pages \ mandoc \ mosquitto \ popt \ soxr \ curl \ dhclient RUN rm -rfv /lib/apk/db/* && \ rm -rfv /etc/avahi/services/*.service && \ addgroup shairport-sync && \ adduser -D shairport-sync -G shairport-sync && \ addgroup -g 29 docker_audio && \ addgroup shairport-sync docker_audio && \ addgroup shairport-sync audio && \ mkdir -p /run/dbus # Remove anything we don't need. # Remove any statically-defined Avahi services, e.g. SSH and SFTP # Create non-root user for running the container -- running as the user 'shairport-sync' also allows # Shairport Sync to provide the D-Bus and MPRIS interfaces within the container # Add the shairport-sync user to the pre-existing audio group, which has ID 29, for access to the ALSA stuff COPY --from=files / / COPY --from=build-files / / ENTRYPOINT ["/init","./run.sh"]