94 lines
3.7 KiB
Docker
94 lines
3.7 KiB
Docker
# Containerfile for a CUPS print server sharing a Brother HL-4150CDN over
|
|
# IPP/AirPrint. Build with Podman:
|
|
#
|
|
# podman build -t printserver:latest .
|
|
#
|
|
# Run with host networking so mDNS (Avahi) can advertise the printer. The
|
|
# printer is described by environment variables:
|
|
#
|
|
# podman run --rm --network host \
|
|
# -e PRINTER_IP=192.168.1.50 \
|
|
# -e PRINTER_NAME=HL-4150CDN \
|
|
# --name printserver printserver:latest
|
|
#
|
|
# PRINTER_URI can be used instead of PRINTER_IP for full control:
|
|
#
|
|
# -e PRINTER_URI=lpd://192.168.1.50/binary_p1
|
|
#
|
|
FROM debian:bookworm-slim
|
|
|
|
ENV DEBIAN_FRONTEND=noninteractive
|
|
|
|
# --- Task 2.1 / 2.2: base system, CUPS, Avahi, DBus and i386 runtime -------
|
|
# The Brother filter binaries are 32-bit i386 ELF executables, so the i386
|
|
# architecture has to be enabled and the matching runtime libraries installed.
|
|
RUN dpkg --add-architecture i386 \
|
|
&& apt-get update \
|
|
&& apt-get install -y --no-install-recommends \
|
|
cups \
|
|
cups-client \
|
|
cups-filters \
|
|
cups-ppdc \
|
|
avahi-daemon \
|
|
avahi-utils \
|
|
libnss-mdns \
|
|
dbus \
|
|
procps \
|
|
curl \
|
|
ghostscript \
|
|
ca-certificates \
|
|
poppler-utils \
|
|
libc6:i386 \
|
|
libstdc++6:i386 \
|
|
libgcc-s1:i386 \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Make sure the 32-bit dynamic loader the Brother binaries ask for exists,
|
|
# even if the i386 libc places it only in the multiarch directory.
|
|
RUN if [ ! -e /lib/ld-linux.so.2 ] && [ -e /lib/i386-linux-gnu/ld-linux.so.2 ]; then \
|
|
ln -s /lib/i386-linux-gnu/ld-linux.so.2 /lib/ld-linux.so.2; \
|
|
fi \
|
|
&& test -e /lib/ld-linux.so.2
|
|
|
|
# --- Task 2.3: install the Brother HL-4150CDN driver packages --------------
|
|
# Copy the local driver packages from the repository into the build context and
|
|
# install them. The LPR package must be installed before the CUPS wrapper
|
|
# package, which depends on it. `--force-all` is used because the packages are
|
|
# built for i386 and have no dependency information Debian can satisfy here.
|
|
# The whole assets tree is copied because the directory name contains a space,
|
|
# which some COPY implementations cannot quote.
|
|
COPY assets /tmp/assets
|
|
|
|
RUN mkdir -p /var/spool/lpd \
|
|
&& dpkg -i --force-all "/tmp/assets/Brother HL-4150CDN/lpr-driver/hl4150cdnlpr-1.1.1-5.i386.deb" \
|
|
&& dpkg -i --force-all "/tmp/assets/Brother HL-4150CDN/cupswrapper/hl4150cdncupswrapper-1.1.1-5.i386.deb" \
|
|
&& dpkg -s hl4150cdnlpr:i386 hl4150cdncupswrapper:i386 >/dev/null \
|
|
&& rm -rf /tmp/assets
|
|
|
|
# --- Task 2.4: configure CUPS and verify the driver files are in place -----
|
|
# The CUPS wrapper postinst copies the PPD into the CUPS model directory and
|
|
# creates the brlpdwrapper filter. Fail the build if anything is missing.
|
|
RUN test -f /usr/share/cups/model/brhl4150cdn.ppd \
|
|
&& test -x /usr/lib/cups/filter/brlpdwrapperhl4150cdn \
|
|
&& test -x /usr/local/Brother/Printer/hl4150cdn/lpd/brhl4150cdnfilter \
|
|
&& mkdir -p /usr/share/ppd \
|
|
&& ln -sf /usr/share/cups/model/brhl4150cdn.ppd /usr/share/ppd/brhl4150cdn.ppd \
|
|
&& rm -f /etc/cups/printers.conf /etc/cups/printers.conf.O
|
|
|
|
COPY cupsd.conf /etc/cups/cupsd.conf
|
|
|
|
# CUPS needs the runtime directories to exist in the image.
|
|
RUN mkdir -p /run/cups /run/dbus /run/avahi-daemon /var/spool/cups /var/log/cups
|
|
|
|
# --- Task 2.5: startup script -----------------------------------------------
|
|
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
|
|
RUN chmod 0755 /usr/local/bin/entrypoint.sh
|
|
|
|
# --- Task 2.6: exposed ports ------------------------------------------------
|
|
# 631/tcp CUPS administration and IPP
|
|
# 5353/udp mDNS / DNS-SD for AirPrint discovery
|
|
EXPOSE 631/tcp
|
|
EXPOSE 5353/udp
|
|
|
|
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
|