1- FROM debian:bookworm-slim
1+ # syntax=docker/dockerfile:1
2+ # check=error=true
23
3- ARG TARGETARCH
4- ARG TARGETPLATFORM
4+ ARG FFMPEG_DATE= "2025-01-10-19-43"
5+ ARG FFMPEG_VERSION= "N-118280-g5cd49e1bfd"
56
67ARG S6_VERSION="3.2.0.2"
8+
79ARG SHA256_S6_AMD64="59289456ab1761e277bd456a95e737c06b03ede99158beb24f12b165a904f478"
810ARG SHA256_S6_ARM64="8b22a2eaca4bf0b27a43d36e65c89d2701738f628d1abd0cea5569619f66f785"
911ARG SHA256_S6_NOARCH="6dbcde158a3e78b9bb141d7bcb5ccb421e563523babbe2c64470e76f4fd02dae"
1012
11- ARG FFMPEG_DATE="autobuild-2024-12-24-14-15"
12- ARG FFMPEG_VERSION="N-118163-g954d55c2a4"
13- ARG SHA256_FFMPEG_AMD64="798a7e5a0724139e6bb70df8921522b23be27028f9f551dfa83c305ec4ffaf3a"
14- ARG SHA256_FFMPEG_ARM64="c3e6cc0fec42cc7e3804014fbb02c1384a1a31ef13f6f9a36121f2e1216240c0"
13+ ARG ALPINE_VERSION="latest"
14+ ARG FFMPEG_PREFIX_FILE="ffmpeg-${FFMPEG_VERSION}"
15+ ARG FFMPEG_SUFFIX_FILE=".tar.xz"
16+
17+ ARG FFMPEG_CHECKSUM_ALGORITHM="sha256"
18+ ARG S6_CHECKSUM_ALGORITHM="sha256"
19+
20+ FROM alpine:${ALPINE_VERSION} AS ffmpeg-download
21+ ARG FFMPEG_DATE
22+ ARG FFMPEG_VERSION
23+ ARG FFMPEG_PREFIX_FILE
24+ ARG FFMPEG_SUFFIX_FILE
25+ ARG SHA256_FFMPEG_AMD64
26+ ARG SHA256_FFMPEG_ARM64
27+ ARG FFMPEG_CHECKSUM_ALGORITHM
28+ ARG CHECKSUM_ALGORITHM="${FFMPEG_CHECKSUM_ALGORITHM}"
29+ ARG FFMPEG_CHECKSUM_AMD64="${SHA256_FFMPEG_AMD64}"
30+ ARG FFMPEG_CHECKSUM_ARM64="${SHA256_FFMPEG_ARM64}"
31+
32+ ARG FFMPEG_FILE_SUMS="checksums.${CHECKSUM_ALGORITHM}"
33+ ARG FFMPEG_URL="https://github.com/yt-dlp/FFmpeg-Builds/releases/download/autobuild-${FFMPEG_DATE}"
34+
35+ ARG DESTDIR="/downloaded"
36+ ARG TARGETARCH
37+ ADD "${FFMPEG_URL}/${FFMPEG_FILE_SUMS}" "${DESTDIR}/"
38+ RUN set -eu ; \
39+ apk --no-cache --no-progress add cmd:aria2c cmd:awk ; \
40+ \
41+ aria2c_options() { \
42+ algorithm="${CHECKSUM_ALGORITHM%[0-9]??}" ; \
43+ bytes="${CHECKSUM_ALGORITHM#${algorithm}}" ; \
44+ hash="$( awk -v fn=" ${1##*/}" '$0 ~ fn" $" { print $1; exit; }' " ${DESTDIR}/${FFMPEG_FILE_SUMS}" )" ; \
45+ \
46+ printf -- '\t %s\n ' \
47+ 'allow-overwrite=true' \
48+ 'always-resume=false' \
49+ 'check-integrity=true' \
50+ "checksum=${algorithm}-${bytes}=${hash}" \
51+ 'max-connection-per-server=2' \
52+ ; \
53+ printf -- '\n ' ; \
54+ } ; \
55+ \
56+ decide_arch() { \
57+ case "${TARGETARCH}" in \
58+ (amd64) printf -- 'linux64' ;; \
59+ (arm64) printf -- 'linuxarm64' ;; \
60+ esac ; \
61+ } ; \
62+ \
63+ FFMPEG_ARCH="$(decide_arch)" ; \
64+ FFMPEG_PREFIX_FILE="$( printf -- '%s' " ${FFMPEG_PREFIX_FILE}" | cut -d '-' -f 1,2 )" ; \
65+ for url in $(awk ' \
66+ $2 ~ /^[*]?' "${FFMPEG_PREFIX_FILE}" '/ && /-' "${FFMPEG_ARCH}" '-/ { $1=""; print; } \
67+ ' "${DESTDIR}/${FFMPEG_FILE_SUMS}" ) ; \
68+ do \
69+ url="${FFMPEG_URL}/${url# }" ; \
70+ printf -- '%s\n ' "${url}" ; \
71+ aria2c_options "${url}" ; \
72+ printf -- '\n ' ; \
73+ done > /tmp/downloads ; \
74+ unset -v url ; \
75+ \
76+ aria2c --no-conf=true \
77+ --dir /downloaded \
78+ --lowest-speed-limit='16K' \
79+ --show-console-readout=false \
80+ --summary-interval=0 \
81+ --input-file /tmp/downloads ; \
82+ \
83+ apk --no-cache --no-progress add "cmd:${CHECKSUM_ALGORITHM}sum" ; \
84+ \
85+ decide_expected() { \
86+ case "${TARGETARCH}" in \
87+ (amd64) printf -- '%s' "${FFMPEG_CHECKSUM_AMD64}" ;; \
88+ (arm64) printf -- '%s' "${FFMPEG_CHECKSUM_ARM64}" ;; \
89+ esac ; \
90+ } ; \
91+ \
92+ FFMPEG_HASH="$(decide_expected)" ; \
93+ \
94+ cd "${DESTDIR}" ; \
95+ if [ -n "${FFMPEG_HASH}" ] ; \
96+ then \
97+ printf -- '%s *%s\n ' "${FFMPEG_HASH}" "${FFMPEG_PREFIX_FILE}" *-"${FFMPEG_ARCH}" -*"${FFMPEG_SUFFIX_FILE}" >> /tmp/SUMS ; \
98+ "${CHECKSUM_ALGORITHM}sum" --check --warn --strict /tmp/SUMS || exit ; \
99+ fi ; \
100+ "${CHECKSUM_ALGORITHM}sum" --check --warn --strict --ignore-missing "${DESTDIR}/${FFMPEG_FILE_SUMS}" ; \
101+ \
102+ mkdir -v -p "/verified/${TARGETARCH}" ; \
103+ ln -v "${FFMPEG_PREFIX_FILE}" *-"${FFMPEG_ARCH}" -*"${FFMPEG_SUFFIX_FILE}" "/verified/${TARGETARCH}/" ; \
104+ rm -rf "${DESTDIR}" ;
105+
106+ FROM alpine:${ALPINE_VERSION} AS ffmpeg-extracted
107+ COPY --from=ffmpeg-download /verified /verified
108+
109+ ARG FFMPEG_PREFIX_FILE
110+ ARG FFMPEG_SUFFIX_FILE
111+ ARG TARGETARCH
112+ RUN set -eux ; \
113+ mkdir -v /extracted ; \
114+ cd /extracted ; \
115+ ln -s "/verified/${TARGETARCH}" /"${FFMPEG_PREFIX_FILE}" *"${FFMPEG_SUFFIX_FILE}" "/tmp/ffmpeg${FFMPEG_SUFFIX_FILE}" ; \
116+ tar -tf "/tmp/ffmpeg${FFMPEG_SUFFIX_FILE}" | grep '/bin/\( ffmpeg\| ffprobe\) ' > /tmp/files ; \
117+ tar -xop \
118+ --strip-components=2 \
119+ -f "/tmp/ffmpeg${FFMPEG_SUFFIX_FILE}" \
120+ -T /tmp/files ; \
121+ \
122+ ls -AlR /extracted ;
123+
124+ FROM scratch AS ffmpeg
125+ COPY --from=ffmpeg-extracted /extracted /usr/local/bin/
126+
127+ FROM alpine:${ALPINE_VERSION} AS s6-overlay-download
128+ ARG S6_VERSION
129+ ARG SHA256_S6_AMD64
130+ ARG SHA256_S6_ARM64
131+ ARG SHA256_S6_NOARCH
132+
133+ ARG DESTDIR="/downloaded"
134+ ARG S6_CHECKSUM_ALGORITHM
135+ ARG CHECKSUM_ALGORITHM="${S6_CHECKSUM_ALGORITHM}"
136+
137+ ARG S6_CHECKSUM_AMD64="${CHECKSUM_ALGORITHM}:${SHA256_S6_AMD64}"
138+ ARG S6_CHECKSUM_ARM64="${CHECKSUM_ALGORITHM}:${SHA256_S6_ARM64}"
139+ ARG S6_CHECKSUM_NOARCH="${CHECKSUM_ALGORITHM}:${SHA256_S6_NOARCH}"
140+
141+ ARG S6_OVERLAY_URL="https://github.com/just-containers/s6-overlay/releases/download/v${S6_VERSION}"
142+ ARG S6_PREFIX_FILE="s6-overlay-"
143+ ARG S6_SUFFIX_FILE=".tar.xz"
144+
145+ ARG S6_FILE_AMD64="${S6_PREFIX_FILE}x86_64${S6_SUFFIX_FILE}"
146+ ARG S6_FILE_ARM64="${S6_PREFIX_FILE}aarch64${S6_SUFFIX_FILE}"
147+ ARG S6_FILE_NOARCH="${S6_PREFIX_FILE}noarch${S6_SUFFIX_FILE}"
148+
149+ ADD "${S6_OVERLAY_URL}/${S6_FILE_AMD64}.${CHECKSUM_ALGORITHM}" "${DESTDIR}/"
150+ ADD "${S6_OVERLAY_URL}/${S6_FILE_ARM64}.${CHECKSUM_ALGORITHM}" "${DESTDIR}/"
151+ ADD "${S6_OVERLAY_URL}/${S6_FILE_NOARCH}.${CHECKSUM_ALGORITHM}" "${DESTDIR}/"
152+
153+ # #ADD --checksum="${S6_CHECKSUM_AMD64}" "${S6_OVERLAY_URL}/${S6_FILE_AMD64}" "${DESTDIR}/"
154+ # #ADD --checksum="${S6_CHECKSUM_ARM64}" "${S6_OVERLAY_URL}/${S6_FILE_ARM64}" "${DESTDIR}/"
155+ # #ADD --checksum="${S6_CHECKSUM_NOARCH}" "${S6_OVERLAY_URL}/${S6_FILE_NOARCH}" "${DESTDIR}/"
156+
157+ # --checksum wasn't recognized, so use busybox to check the sums instead
158+ ADD "${S6_OVERLAY_URL}/${S6_FILE_AMD64}" "${DESTDIR}/"
159+ RUN set -eu ; checksum="${S6_CHECKSUM_AMD64}" ; file="${S6_FILE_AMD64}" ; cd "${DESTDIR}/" && \
160+ printf -- '%s *%s\n ' "$(printf -- '%s' " ${checksum}" | cut -d : -f 2-)" "${file}" | "${CHECKSUM_ALGORITHM}sum" -cw
161+
162+ ADD "${S6_OVERLAY_URL}/${S6_FILE_ARM64}" "${DESTDIR}/"
163+ RUN set -eu ; checksum="${S6_CHECKSUM_ARM64}" ; file="${S6_FILE_ARM64}" ; cd "${DESTDIR}/" && \
164+ printf -- '%s *%s\n ' "$(printf -- '%s' " ${checksum}" | cut -d : -f 2-)" "${file}" | "${CHECKSUM_ALGORITHM}sum" -cw
165+
166+ ADD "${S6_OVERLAY_URL}/${S6_FILE_NOARCH}" "${DESTDIR}/"
167+ RUN set -eu ; checksum="${S6_CHECKSUM_NOARCH}" ; file="${S6_FILE_NOARCH}" ; cd "${DESTDIR}/" && \
168+ printf -- '%s *%s\n ' "$(printf -- '%s' " ${checksum}" | cut -d : -f 2-)" "${file}" | "${CHECKSUM_ALGORITHM}sum" -cw
169+
170+ FROM alpine:${ALPINE_VERSION} AS s6-overlay-extracted
171+ COPY --from=s6-overlay-download /downloaded /downloaded
172+
173+ ARG S6_CHECKSUM_ALGORITHM
174+ ARG CHECKSUM_ALGORITHM="${S6_CHECKSUM_ALGORITHM}"
175+
176+ ARG TARGETARCH
177+
178+ RUN set -eu ; \
179+ \
180+ decide_arch() { \
181+ local arg1 ; \
182+ arg1="${1:-$(uname -m)}" ; \
183+ \
184+ case "${arg1}" in \
185+ (amd64) printf -- 'x86_64' ;; \
186+ (arm64) printf -- 'aarch64' ;; \
187+ (armv7l) printf -- 'arm' ;; \
188+ (*) printf -- '%s' "${arg1}" ;; \
189+ esac ; \
190+ unset -v arg1 ; \
191+ } ; \
192+ \
193+ apk --no-cache --no-progress add "cmd:${CHECKSUM_ALGORITHM}sum" ; \
194+ mkdir -v /verified ; \
195+ cd /downloaded ; \
196+ for f in *.sha256 ; \
197+ do \
198+ "${CHECKSUM_ALGORITHM}sum" --check --warn --strict "${f}" || exit ; \
199+ ln -v "${f%.sha256}" /verified/ || exit ; \
200+ done ; \
201+ unset -v f ; \
202+ \
203+ S6_ARCH="$(decide_arch " ${TARGETARCH}")" ; \
204+ set -x ; \
205+ mkdir -v /s6-overlay-rootfs ; \
206+ cd /s6-overlay-rootfs ; \
207+ for f in /verified/*.tar* ; \
208+ do \
209+ case "${f}" in \
210+ (*-noarch.tar*|*-"${S6_ARCH}" .tar*) \
211+ tar -xpf "${f}" || exit ;; \
212+ esac ; \
213+ done ; \
214+ set +x ; \
215+ unset -v f ;
216+
217+ FROM scratch AS s6-overlay
218+ COPY --from=s6-overlay-extracted /s6-overlay-rootfs /
219+
220+ FROM debian:bookworm-slim AS tubesync
221+
222+ ARG TARGETARCH
223+ ARG TARGETPLATFORM
224+
225+ ARG S6_VERSION
226+
227+ ARG FFMPEG_DATE
228+ ARG FFMPEG_VERSION
15229
16230ENV S6_VERSION="${S6_VERSION}" \
17231 FFMPEG_DATE="${FFMPEG_DATE}" \
@@ -26,89 +240,20 @@ ENV DEBIAN_FRONTEND="noninteractive" \
26240 S6_CMD_WAIT_FOR_SERVICES_MAXTIME="0"
27241
28242# Install third party software
243+ COPY --from=s6-overlay / /
244+ COPY --from=ffmpeg /usr/local/bin/ /usr/local/bin/
245+
29246# Reminder: the SHELL handles all variables
30- RUN decide_arch() { \
31- case "${TARGETARCH:=amd64}" in \
32- (arm64) printf -- 'aarch64' ;; \
33- (*) printf -- '%s' "${TARGETARCH}" ;; \
34- esac ; \
35- } && \
36- decide_expected() { \
37- case "${1}" in \
38- (ffmpeg) case "${2}" in \
39- (amd64) printf -- '%s' "${SHA256_FFMPEG_AMD64}" ;; \
40- (arm64) printf -- '%s' "${SHA256_FFMPEG_ARM64}" ;; \
41- esac ;; \
42- (s6) case "${2}" in \
43- (amd64) printf -- '%s' "${SHA256_S6_AMD64}" ;; \
44- (arm64) printf -- '%s' "${SHA256_S6_ARM64}" ;; \
45- (noarch) printf -- '%s' "${SHA256_S6_NOARCH}" ;; \
46- esac ;; \
47- esac ; \
48- } && \
49- decide_url() { \
50- case "${1}" in \
51- (ffmpeg) printf -- \
52- 'https://github.com/yt-dlp/FFmpeg-Builds/releases/download/%s/ffmpeg-%s-linux%s-gpl%s.tar.xz' \
53- "${FFMPEG_DATE}" \
54- "${FFMPEG_VERSION}" \
55- "$(case " ${2}" in \
56- (amd64) printf -- '64' ;; \
57- (*) printf -- '%s' " ${2}" ;; \
58- esac)" \
59- "$(case " ${FFMPEG_VERSION%%-*}" in \
60- (n*) printf -- '-%s\n ' " ${FFMPEG_VERSION#n}" | cut -d '-' -f 1,2 ;; \
61- (*) printf -- '' ;; \
62- esac)" ;; \
63- (s6) printf -- \
64- 'https://github.com/just-containers/s6-overlay/releases/download/v%s/s6-overlay-%s.tar.xz' \
65- "${S6_VERSION}" \
66- "$(case " ${2}" in \
67- (amd64) printf -- 'x86_64' ;; \
68- (arm64) printf -- 'aarch64' ;; \
69- (*) printf -- '%s' " ${2}" ;; \
70- esac)" ;; \
71- esac ; \
72- } && \
73- verify_download() { \
74- while [ $# -ge 2 ] ; do \
75- sha256sum "${2}" ; \
76- printf -- '%s %s\n ' "${1}" "${2}" | sha256sum -c || return ; \
77- shift ; shift ; \
78- done ; \
79- } && \
80- download_expected_file() { \
81- local arg1 expected file url ; \
82- arg1="$(printf -- '%s\n ' " ${1}" | awk '{print toupper($0);}')" ; \
83- expected="$(decide_expected " ${1}" " ${2}")" ; \
84- file="${3}" ; \
85- url="$(decide_url " ${1}" " ${2}")" ; \
86- printf -- '%s\n ' \
87- "Building for arch: ${2}|${ARCH}, downloading ${arg1} from: ${url}, expecting ${arg1} SHA256: ${expected}" && \
88- rm -rf "${file}" && \
89- curl --disable --output "${file}" --clobber --location --no-progress-meter --url "${url}" && \
90- verify_download "${expected}" "${file}" ; \
91- } && \
92- export ARCH="$(decide_arch)" && \
93- set -x && \
247+ RUN set -x && \
94248 apt-get update && \
95249 apt-get -y --no-install-recommends install locales && \
96250 printf -- "en_US.UTF-8 UTF-8\n " > /etc/locale.gen && \
97251 locale-gen en_US.UTF-8 && \
98252 # Install required distro packages
99253 apt-get -y --no-install-recommends install curl ca-certificates file binutils xz-utils && \
100- # Install s6
101- _file="/tmp/s6-overlay-noarch.tar.xz" && \
102- download_expected_file s6 noarch "${_file}" && \
103- tar -C / -xpf "${_file}" && rm -f "${_file}" && \
104- _file="/tmp/s6-overlay-${ARCH}.tar.xz" && \
105- download_expected_file s6 "${TARGETARCH}" "${_file}" && \
106- tar -C / -xpf "${_file}" && rm -f "${_file}" && \
254+ # Installed s6 (using COPY earlier)
107255 file -L /command/s6-overlay-suexec && \
108- # Install ffmpeg
109- _file="/tmp/ffmpeg-${ARCH}.tar.xz" && \
110- download_expected_file ffmpeg "${TARGETARCH}" "${_file}" && \
111- tar -xvvpf "${_file}" --strip-components=2 --no-anchored -C /usr/local/bin/ "ffmpeg" "ffprobe" && rm -f "${_file}" && \
256+ # Installed ffmpeg (using COPY earlier)
112257 /usr/local/bin/ffmpeg -version && \
113258 file /usr/local/bin/ff* && \
114259 # Clean up
@@ -154,7 +299,9 @@ ENV PIP_NO_COMPILE=1 \
154299WORKDIR /app
155300
156301# Set up the app
157- RUN set -x && \
302+ # BuildKit#RUN --mount=type=bind,source=Pipfile,target=/app/Pipfile \
303+ RUN \
304+ set -x && \
158305 apt-get update && \
159306 # Install required build packages
160307 apt-get -y --no-install-recommends install \
0 commit comments