ARG LIBRETIME_VERSION #======================================================================================# # Python Builder # #======================================================================================# FROM python:3.10-slim-bullseye as python-builder WORKDIR /build # Wheels WORKDIR /build/shared COPY shared . RUN pip wheel --wheel-dir . --no-deps . WORKDIR /build/api-client COPY api-client . RUN pip wheel --wheel-dir . --no-deps . #======================================================================================# # Python base # #======================================================================================# FROM python:3.10-slim-bullseye as python-base ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 # Custom user ARG USER=libretime ARG UID=1000 ARG GID=1000 RUN set -eux \ && adduser --disabled-password --uid=$UID --gecos '' --no-create-home ${USER} \ && install --directory --owner=${USER} /etc/libretime /srv/libretime ENV LIBRETIME_CONFIG_FILEPATH=/etc/libretime/config.yml # Shared packages COPY tools/packages.py /tmp/packages.py COPY shared/packages.ini /tmp/packages.ini RUN set -eux \ && DEBIAN_FRONTEND=noninteractive apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ git \ $(python3 /tmp/packages.py --format=line --exclude=python bullseye /tmp/packages.ini) \ && rm -rf /var/lib/apt/lists/* \ && rm -f /tmp/packages.py /tmp/packages.ini #======================================================================================# # Python base with ffmpeg # #======================================================================================# FROM python-base as python-base-ffmpeg RUN set -eux \ && DEBIAN_FRONTEND=noninteractive apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ ffmpeg \ && rm -rf /var/lib/apt/lists/* #======================================================================================# # Analyzer # #======================================================================================# FROM python-base-ffmpeg as libretime-analyzer COPY tools/packages.py /tmp/packages.py COPY analyzer/packages.ini /tmp/packages.ini RUN set -eux \ && DEBIAN_FRONTEND=noninteractive apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ $(python3 /tmp/packages.py --format=line --exclude=python bullseye /tmp/packages.ini) \ && rm -rf /var/lib/apt/lists/* \ && rm -f /tmp/packages.py /tmp/packages.ini WORKDIR /src COPY analyzer/requirements.txt . RUN --mount=type=cache,target=/root/.cache/pip \ pip install --no-compile -r requirements.txt COPY --from=python-builder /build/shared/*.whl . RUN --mount=type=cache,target=/root/.cache/pip \ pip install --no-compile *.whl && rm -Rf *.whl COPY analyzer . RUN --mount=type=cache,target=/root/.cache/pip \ pip install --editable .[sentry] # Run USER ${UID}:${GID} WORKDIR /app CMD ["/usr/local/bin/libretime-analyzer"] ARG LIBRETIME_VERSION ENV LIBRETIME_VERSION=$LIBRETIME_VERSION #======================================================================================# # Playout # #======================================================================================# FROM python-base-ffmpeg as libretime-playout COPY tools/packages.py /tmp/packages.py COPY playout/packages.ini /tmp/packages.ini RUN set -eux \ && DEBIAN_FRONTEND=noninteractive apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ $(python3 /tmp/packages.py --format=line --exclude=python bullseye /tmp/packages.ini) \ && rm -rf /var/lib/apt/lists/* \ && rm -f /tmp/packages.py /tmp/packages.ini WORKDIR /src COPY playout/requirements.txt . RUN --mount=type=cache,target=/root/.cache/pip \ pip install --no-compile -r requirements.txt COPY --from=python-builder /build/shared/*.whl . COPY --from=python-builder /build/api-client/*.whl . RUN --mount=type=cache,target=/root/.cache/pip \ pip install --no-compile *.whl && rm -Rf *.whl COPY playout . RUN --mount=type=cache,target=/root/.cache/pip \ pip install --editable .[sentry] # Run USER ${UID}:${GID} WORKDIR /app CMD ["/usr/local/bin/libretime-playout"] ARG LIBRETIME_VERSION ENV LIBRETIME_VERSION=$LIBRETIME_VERSION #======================================================================================# # API # #======================================================================================# FROM python-base as libretime-api RUN set -eux \ && DEBIAN_FRONTEND=noninteractive apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ gcc \ libc6-dev \ libpq-dev \ && rm -rf /var/lib/apt/lists/* WORKDIR /src COPY api/requirements.txt . RUN --mount=type=cache,target=/root/.cache/pip \ pip install --no-compile gunicorn uvicorn -r requirements.txt COPY --from=python-builder /build/shared/*.whl . RUN --mount=type=cache,target=/root/.cache/pip \ pip install --no-compile *.whl && rm -Rf *.whl COPY api . RUN --mount=type=cache,target=/root/.cache/pip \ pip install --editable .[prod,sentry] # Run USER ${UID}:${GID} WORKDIR /app CMD ["/usr/local/bin/gunicorn", \ "--workers=4", \ "--worker-class=uvicorn.workers.UvicornWorker", \ "--log-file", "-", \ "--bind=0.0.0.0:9001", \ "libretime_api.asgi"] ARG LIBRETIME_VERSION ENV LIBRETIME_VERSION=$LIBRETIME_VERSION HEALTHCHECK CMD ["python3", "-c", \ "import requests; requests.get('http://localhost:9001/api/v2/version').raise_for_status()"] #======================================================================================# # Worker # #======================================================================================# FROM python-base as libretime-worker WORKDIR /src COPY worker/requirements.txt . RUN --mount=type=cache,target=/root/.cache/pip \ pip install --no-compile -r requirements.txt COPY --from=python-builder /build/shared/*.whl . RUN --mount=type=cache,target=/root/.cache/pip \ pip install --no-compile *.whl && rm -Rf *.whl COPY worker . RUN --mount=type=cache,target=/root/.cache/pip \ pip install --editable .[sentry] # Run USER ${UID}:${GID} WORKDIR /app CMD ["/usr/local/bin/celery", "worker", \ "--app=libretime_worker.tasks:worker", \ "--config=libretime_worker.config", \ "--time-limit=1800", \ "--concurrency=1", \ "--loglevel=info"] ARG LIBRETIME_VERSION ENV LIBRETIME_VERSION=$LIBRETIME_VERSION #======================================================================================# # Legacy # #======================================================================================# FROM php:7.4-fpm as libretime-legacy ENV LIBRETIME_CONFIG_FILEPATH=/etc/libretime/config.yml ENV LIBRETIME_LOG_FILEPATH=php://stderr # Custom user ARG USER=libretime ARG UID=1000 ARG GID=1000 RUN set -eux \ && adduser --disabled-password --uid=$UID --gecos '' --no-create-home ${USER} \ && install --directory --owner=${USER} /etc/libretime /srv/libretime RUN set -eux \ && DEBIAN_FRONTEND=noninteractive apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ gettext \ libcurl4-openssl-dev \ libfreetype6-dev \ libjpeg62-turbo-dev \ libonig-dev \ libpng-dev \ libpq-dev \ libxml2-dev \ libyaml-dev \ libzip-dev \ locales \ unzip \ zlib1g-dev \ && rm -rf /var/lib/apt/lists/* \ && pecl install apcu yaml \ && docker-php-ext-enable apcu yaml \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) \ bcmath \ curl \ exif \ gd \ gettext \ mbstring \ opcache \ pdo_pgsql \ pgsql \ sockets \ xml COPY legacy/locale/locale.gen /etc/locale.gen RUN locale-gen RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" COPY "legacy/install/php/libretime-legacy.ini" "$PHP_INI_DIR/conf.d/" COPY --from=composer /usr/bin/composer /usr/local/bin/composer WORKDIR /var/www/html COPY legacy/composer.* ./ RUN composer --no-cache install --no-progress --no-interaction --no-dev --no-autoloader COPY legacy . RUN set -eux \ && make locale-build \ && composer --no-cache dump-autoload --no-interaction --no-dev # Run USER ${UID}:${GID} ARG LIBRETIME_VERSION ENV LIBRETIME_VERSION=$LIBRETIME_VERSION