Шарился я тут в по Интернету в поисках видео событий 15-летний давности и нашел что-то вроде искомого, но никак не смог посмотреть - требовался Adobe Flash. Погуглил я как мне открыть это видео, но рабочих вариантов не нашел. "Ладно" - подумал я: "Challenge accepted". А нам с читателем лишняя возможность потренироваться в создании Docker-контейнеров.
Дисклеймер: использование устаревших версий браузера и самого Flash-плагина несёт потенциальную угрозу безопасности. Используйте этот метод на свой страх и риск.
Итак, начнём с того, что поддержка Flash-плагина была выпилена в Chromium начиная с версии 89. То есть нам нужно что-то где есть более ранняя версия. Это что-то - это Ubuntu 18.04 - там 65я версия, если без апдейтов, а с апдейтами 112-я. В какой-то момент должна была быть и 88-ая, но не нашел где её добыть - если читатель подскажет, буду безмерно благодарен. И так, поехали - создаём Dockerfile
FROM ubuntu:18.04
ARG DEBIAN_FRONTEND=noninteractive
ARG CHROMIUM_VERSION=65.0.3325.181-0ubuntu1
RUN apt-get update && \
apt-get upgrade -y && \
apt-get install -y \
chromium-browser=$CHROMIUM_VERSION \
chromium-browser-l10n=$CHROMIUM_VERSION \
chromium-codecs-ffmpeg-extra=$CHROMIUM_VERSION \
apt-get clean && rm -rf /var/lib/apt/lists/* /var/cache/*
Берем официальный образ ubuntu:18.04 за основу. Получаем список пакетов, устанавливаем обновления и ставим собственно браузер явным образом указывая версию - иначе установится последняя (на момент написания статьи) 112-я.
Последняя (12-я) строчка занимается тем, что удаляет из данного "слоя" скаченные deb-файлы и кэши, необходимые команде apt. В работе с контейнерами это правило хорошего тона.
Запускать будем под юзером, иначе Chromium будет ругаться. Создадим его, но без пароля:
RUN adduser --gecos "user" --disabled-password --shell /bin/bash user
Скачаем собственно архив с последней версией Flash-плагина для Chromium'а, который наудачу сохранили в Архиве Интернета:
ADD https://web.archive.org/web/20210000000000id_/https://fpdownload.adobe.com/get/flashplayer/pdc/32.0.0.465/flash_player_ppapi_linux.x86_64.tar.gz /tmp
Обращаю ваше внимание на полезное свойство директивы ADD, о котором многие забывают - добавлять можно не только файлы из локального Docker-контекста, но и с произвольного URL'а.
Далее собезъяничаем некоторые телодвижения и конфиги из некогда существовавшего пакета pepperflashplugin-nonfree:
COPY etc /etc
RUN mkdir -p /usr/lib/pepperflashplugin-nonfree && \
tar -xz -f /tmp/flash_player_ppapi_linux.x86_64.tar.gz -C /usr/lib/pepperflashplugin-nonfree libpepflashplayer.so manifest.json && \
chown root:root /usr/lib/pepperflashplugin-nonfree/libpepflashplayer.so && \
chmod 644 /usr/lib/pepperflashplugin-nonfree/libpepflashplayer.so && \
chown root:root /usr/lib/pepperflashplugin-nonfree/manifest.json && \
chmod 644 /usr/lib/pepperflashplugin-nonfree/manifest.json
Устанавливаем DISPLAY для X-сервера
ENV DISPLAY=:0
И, казалось бы, можно запускать Сhromium, но, сделав так, упрёмся в первую неприятность: плагин будет проверять текущее время и, если оно перевалило за какое-то там января 2021-го года, то он откажется работать. Поэтому со временем надо его обмануть, для этого в список устанавливаемых пакетов вместе с Chromium'ом необходимо включить пакет faketime
. Запустив Chromium из-под faketime, мы столкнемся с другой проблемой - сертификаты SSL не будут проходить проверку, так как все он выданы в будущем (для нашего фейкового времени). Посему придется игнорировать ошибки сертификатов параметром браузера --ignore-certificate-errors
. В итоге получаем следующую точку входа в контейнер
CMD ["/usr/bin/faketime", "2020-12-24 08:15:42", "/usr/bin/chromium-browser", "--ignore-certificate-errors"]
Собираем Docker-образ, например, следующей командой:
docker build -t flash-image .
И запускаем это дело следующей командой:
docker run -it --rm --user user:user -v /tmp/.X11-unix/:/tmp/.X11-unix --cap-add SYS_ADMIN flash-image
А вот и страничка хроник суровых будней российских, на которой это можно проверить: https://www.zaks.ru/new/archive/view/68760
Целиком это всё можно в готовом виде забрать в репозитории https://github.com/dmitrmax/flash-in-docker
Комментарии (34)
gudvinr
23.03.2024 04:13Последняя (12-я) строчка занимается тем, что удаляет из данного "слоя" скаченные deb-файлы и кэши, необходимые команде apt. В работе с контейнерами это правило хорошего тона.
Это давно не совсем так, потому что
Official Debian and Ubuntu images automatically run apt-get clean, so explicit invocation is not required.
remzalp
23.03.2024 04:13Это делали для нашего контейнера, на котором мы базируемся. А вот в нашем контейнере кэши уже есть, так что будет хорошо их почистить
gudvinr
23.03.2024 04:13Нет, это добавляется в Post-Invoke хуки, т.е. вызывается автоматически после выполнения apt-get в Dockerfile, который вы сами пишете.
dmitrmax Автор
23.03.2024 04:13Здесь написано про то, что после того, как имидж забустраплен, из кэша удаляется вся эта бадяга. Но мы в этом тьюториале создаем свой имидж на базе официально. После выполнения команды apt-get update, вся эта лабуда для работы пакетного менеджера, будет загружена из репозитория вновь и если вы не удалите её, то она так и останется в слое.
gudvinr
23.03.2024 04:13Читайте мой комментарий выше. На настоящий момент, официальные образы настаивают APT внутри контейнера таким образом, что он подчистит следы работы в Dockerfile.
Если не верите мне, можете сами собрать два образа - в одном после apt update удалить кеши, а в другом нет. Разницы в размерах между ними практически не будет
dmitrmax Автор
23.03.2024 04:13Если не верите мне, можете сами собрать два образа - в одном после apt update удалить кеши, а в другом нет. Разницы в размерах между ними практически не будет
Хм.... отличная идея для проверки тезиса, генацвале! Только у вас как с верой в бога - утверждаете его наличие вы, а доказать его отсутствие должен кто-то другой. Но что ж, в этот раз мне не трудно. Взял докерфайл из этого проекта и удалил всё, что ниже первой директивы RUN. Вот что получилось в конце.
flash-image.2 latest 0e14fe71ead7 4 seconds ago 633MB
flash-image.1 latest 502f5cd937e0 39 hours ago 586MB
Разница почти 50 Мб, собственно в основном здесь:du -scb /var/lib/apt/ 45697253 /var/lib/apt/
Стало быть метаинформация по репозиторию не удаляется. А вот *.deb файлов действительно в кэше нет, иначе было бы ещё около 130 Мб. Таким образом,
rm -rf /var/lib/apt/lists/*
имеет смысл делать, аapt-get clean
- нет
aborouhin
23.03.2024 04:13+2Я бы всё же попробовал ruffle для начала, прежде чем с некробраузерами развлекаться, хоть в докере, хоть без оного.
dmitrmax Автор
23.03.2024 04:13+1Эта штука для проигрывания условно игр на флеше. То есть когда у вас есть самодостаточный swf файл, который вы в неё загружаете и играете. С видеопроигрывателями на флеше это так не работает - для проигрывателя нужен видеопоток, который вы собираетесь собственно смотреть. Так что вы написали про первое, что нагуглили, совершенно не врубаясь в то, что вы нашли и как это применимо к задаче, сформулированной в первом абзаце.
aborouhin
23.03.2024 04:13+1Я его не нагуглил, я его давно использую. Причём в виде расширения к Firefox, которое запускает (ну, скажем так, пытается запустить) Flash-контент прямо на веб-страницах, без скачивания swf-файлов.
А вот, кстати, если оно не сработает (что бывает), но конкретный flash-контент мне позарез нужен, - тогда буду выдёргивать swf и как-то пытаться его запустить на виртуальной машине, не имеющей подключения к интернету, ибо выпускать в инет устаревшую на N лет версию браузера - я не настолько... хм, скажем мягко, безрассуден :)
dmitrmax Автор
23.03.2024 04:13тогда буду выдёргивать swf и как-то пытаться его запустить на виртуальной машине
Я же написал, что swf-проигрыватель не самодостаточная сущность. Где вы возьмете сам контент?
не имеющей подключения к интернету
Удачи вам в просмотре видеоплеера без контента )
выпускать в инет устаревшую на N лет версию браузера - я не настолько... хм, скажем мягко, безрассуден :)
А как вы думаете, для чего автор статьи запускает браузер в Docker-контейнере?
aborouhin
23.03.2024 04:13Ещё раз, ruffle работает как расширение в браузере и в некоторых случаях, даже если swf тянет поток откуда-то, он справится. И это самый предпочтительный сценарий, без старых дырявых браузеров и прочих костылей.
Если же он не справляется - тут уже смотрим по ситуации. Контейнер безопасности, конечно, добавляет, но он не панацея ни разу. Я бы лучше одноразовую виртуалку завёл, если уж припрёт, с полным сбросом к исходному состоянию после остановки. А если прямо в оптовых количествах где-то нужные flash-видео лежат, которые ruffle не берёт, - можно копнуть причину поглубже и issue им на github'е открыть.
dmitrmax Автор
23.03.2024 04:13Ещё раз, ruffle работает как расширение в браузере и в некоторых случаях, даже если swf тянет поток откуда-то, он справится. И это самый предпочтительный сценарий, без старых дырявых браузеров и прочих костылей.
Так не работает ваш ruffle в качестве расширения в браузере. Вы б хоть по ссылке из поста сходили б что ли, проверили бы прежде чем каменты строчить-то.
Контейнер безопасности, конечно, добавляет, но он не панацея ни разу.
Ну допустим, автор флэш-а мог быть злобным какером и найти какую-то дырку, не закрытую в последней версии флэша, разместить его и ждать, пока клюнет. Но если он сделал комбо-эксплоит, который будет работать на ядрах и контейнерной обвязке в начале 2024-го, то моё почтение этому дону! )
zorn-v100500
23.03.2024 04:13В какой-то момент должна была быть и 88-ая, но не нашел где её добыть - если читатель подскажет, буду безмерно благодарен
Открываем репу и смотрим доступные версии https://mirror.yandex.ru/ubuntu/pool/universe/c/chromium-browser/
Вон есть 85.0.4183.83 из ближайших к 89
dmitrmax Автор
23.03.2024 04:13Только на размер посмотрите .deb файлов - они необычайно маленькие. А всё потому, что в какой-то момент, убунту решила отказаться от распространения нативных билдов хромиума в пользу snap store. То есть грубо говоря, то, что вы написал, это виртуальный пакет, который пустой внутри себя, но по зависимостям вытягивает уже snap-пакет. Готовы рассказать, как установить flash-плагин внутрь snap-а?
zorn-v100500
23.03.2024 04:13Точно, не обратил внимания. А полноценная только 90, да.
Немного непонятно тогда зачем их держать в репе - snap отдельной жизнью живет и все равно обновит до последней версии.
С дебианом тоже чуток не повезло, самая старая как раз 89 )
А всё потому, что в какой-то момент, убунту решила отказаться от распространения нативных билдов хромиума в пользу snap store
А следом и firefox с thunderbird. И переодически что то ломается - то шрифты, то курсоры, то уведомления.
Thunderbird сейчас вообще сломан на бете 24.04 - нельзя отправить письмо (вернее даже сохранить черновик). Что то с профилями apparmor накосячили судя по всему.
Готовы рассказать, как установить flash-плагин внутрь snap-а?
Вообще думаю можно, но сама идея запускать snap в контейнере не то что попахивает, а пованивает )
dmitrmax Автор
23.03.2024 04:13Немного непонятно тогда зачем их держать в репе - snap отдельной жизнью живет и все равно обновит до последней версии.
Ну вот стоял у вас пакет chromium-browser, а потом вы apt-get upgrade и нужно каким-то образом заменить этот пакет на chromium-snap. Для этого делают пустой пакет, его установка удаляет все файлы старого пакета, а в зависимостях ему прописывают новый пакет - таким образом, вытягивается другая сборка. А юзер типа не замечает - что был у него хромиум до, что остался после, только более новый.
zorn-v100500
23.03.2024 04:13Это понятно, непонятно зачем пакет с 85й версией. Ну держали бы один transitional пакет последней версии.
dmitrmax Автор
23.03.2024 04:13А какая разница какой он версии? Главное, чтобы эта версия была выше, чем версия у пакета с нативной сборкой. Тогда эта версия обновится и вытащит по зависимостям самую последнюю версию snap-сборки.
Johan_Palych
23.03.2024 04:13И, казалось бы, можно запускать Сhromium, но, сделав так, упрёмся в первую неприятность: плагин будет проверять текущее время и, если оно перевалило за какое-то там января 2021-го года, то он откажется работать.
Зачем обманывать? Проще поставить последнюю версию без тайм-бомбы 32.0.0.371:
https://web.archive.org/web/*/http://fpdownload.adobe.com/get/flashplayer/pdc/32.0.0.371/* https://web.archive.org/web/20200530062840if_/https://fpdownload.adobe.com/get/flashplayer/pdc/32.0.0.371/flash_player_npapi_linux.x86_64.tar.gz https://web.archive.org/web/20200524080541if_/https://fpdownload.adobe.com/get/flashplayer/pdc/32.0.0.371/flash_player_ppapi_linux.x86_64.tar.gz
В какой-то момент должна была быть и 88-ая, но не нашел где её добыть - если читатель подскажет, буду безмерно благодарен.
Flash Support Removed from Chromium (Target: Chrome 88+ - Jan 2021)
https://www.chromium.org/flash-roadmap/
Поставить бинарный snapshot легко:
https://chromiumdash.appspot.com/branches (chromium 88 - Branch Pos. 827102)
https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Linux_x64/827102/dmitrmax Автор
23.03.2024 04:13Зачем обманывать?
Где это тут вас кто-то обманывает? На указанной в посте версии поведение именно такое.
Проще поставить последнюю версию без тайм-бомбы 32.0.0.371:
Замечательно, спасибо за инфу, но я лично не знал, в какой момент заложили таймбомбу.
Johan_Palych
23.03.2024 04:13Под "Зачем обманывать?" имелось в виду не то, что Вы обманываете, а установка faketime.
boulder
Хм, а можно всего лишь установить старую версию Mozill'ы, скажем, Palemoon (которая сама по себе неожиданно не обновится), и всё заработает из коробки и без докеров. На Windows — точно запустится, у нас до сих пор используется кое-где ;)
dmitrmax Автор
Что-то я не в курсе того, чтобы мозила распространялась с включенным в неё проприетарным плагином, который к тому же adobe запрещала распространять в составе других продуктов. Может быть, у вас на Windows flash plugin был отдельно установлен, а установленная старая версия мозилы просто цепляла его и всё?
boulder
Именно так, браузер - отдельно, плагин - отдельно. Флэш ведь не знает, что он устарел. К чему сложности?
dmitrmax Автор
Флэш, начиная с какой-то версии, знает, что он устарел, проверяя время на компьютере - об этом отдельно в статье сказано, если вы дочитали до конца. Где взять старую версию флэша, которая не проверяет текущее время - это большой вопрос, так как Adobe удалил со своего сайта вообще все версии флэша.
shaman166
Я и на Linux недавно себе похожее делал - старая FF ( вроде 54) и плагин для flash.
dmitrmax Автор
Статья ведь не про то, что у вас на компьютере по счастливой случайности оказались установленными старый браузер и где-то давно добытый и установленный плагин флэша. Статья про то, как это запустить, если нет ни того, ни другого.
boulder
Старый браузер скачивается элементарно даже с официального сайта Palemoon, старый флэш чуть менее доступен, но дистрибутивов в сети тоже хватает.
dmitrmax Автор
Зашибись! Сделайте теперь это в контейнере. Или вы предлагаете своим читателям запускать старый дырявый браузер со старым дырявым флэшем, скаченным хрен знает откуда, прямо на хосте? )
boulder
Ха, для задачи, описанной в посте, - разово открыть флэш с видео, - не нужно никакой безопасности.