Шарился я тут в по Интернету в поисках видео событий 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)


  1. boulder
    23.03.2024 04:13
    +5

    Хм, а можно всего лишь установить старую версию Mozill'ы, скажем, Palemoon (которая сама по себе неожиданно не обновится), и всё заработает из коробки и без докеров. На Windows — точно запустится, у нас до сих пор используется кое-где ;)


    1. dmitrmax Автор
      23.03.2024 04:13

      Что-то я не в курсе того, чтобы мозила распространялась с включенным в неё проприетарным плагином, который к тому же adobe запрещала распространять в составе других продуктов. Может быть, у вас на Windows flash plugin был отдельно установлен, а установленная старая версия мозилы просто цепляла его и всё?


      1. boulder
        23.03.2024 04:13

        Именно так, браузер - отдельно, плагин - отдельно. Флэш ведь не знает, что он устарел. К чему сложности?


        1. dmitrmax Автор
          23.03.2024 04:13

          Флэш, начиная с какой-то версии, знает, что он устарел, проверяя время на компьютере - об этом отдельно в статье сказано, если вы дочитали до конца. Где взять старую версию флэша, которая не проверяет текущее время - это большой вопрос, так как Adobe удалил со своего сайта вообще все версии флэша.


    1. shaman166
      23.03.2024 04:13

      Я и на Linux недавно себе похожее делал - старая FF ( вроде 54) и плагин для flash.


      1. dmitrmax Автор
        23.03.2024 04:13

        Статья ведь не про то, что у вас на компьютере по счастливой случайности оказались установленными старый браузер и где-то давно добытый и установленный плагин флэша. Статья про то, как это запустить, если нет ни того, ни другого.


        1. boulder
          23.03.2024 04:13

          Старый браузер скачивается элементарно даже с официального сайта Palemoon, старый флэш чуть менее доступен, но дистрибутивов в сети тоже хватает.


          1. dmitrmax Автор
            23.03.2024 04:13

            Зашибись! Сделайте теперь это в контейнере. Или вы предлагаете своим читателям запускать старый дырявый браузер со старым дырявым флэшем, скаченным хрен знает откуда, прямо на хосте? )


            1. boulder
              23.03.2024 04:13

              Ха, для задачи, описанной в посте, - разово открыть флэш с видео, - не нужно никакой безопасности.


  1. 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.


    1. remzalp
      23.03.2024 04:13

      Это делали для нашего контейнера, на котором мы базируемся. А вот в нашем контейнере кэши уже есть, так что будет хорошо их почистить


      1. gudvinr
        23.03.2024 04:13

        https://github.com/moby/moby/blob/03e2923e42446dbb830c654d0eec323a0b4ef02a/contrib/mkimage/debootstrap#L82-L105

        Нет, это добавляется в Post-Invoke хуки, т.е. вызывается автоматически после выполнения apt-get в Dockerfile, который вы сами пишете.


    1. dmitrmax Автор
      23.03.2024 04:13

      Здесь написано про то, что после того, как имидж забустраплен, из кэша удаляется вся эта бадяга. Но мы в этом тьюториале создаем свой имидж на базе официально. После выполнения команды apt-get update, вся эта лабуда для работы пакетного менеджера, будет загружена из репозитория вновь и если вы не удалите её, то она так и останется в слое.


      1. gudvinr
        23.03.2024 04:13

        Читайте мой комментарий выше. На настоящий момент, официальные образы настаивают APT внутри контейнера таким образом, что он подчистит следы работы в Dockerfile.

        Если не верите мне, можете сами собрать два образа - в одном после apt update удалить кеши, а в другом нет. Разницы в размерах между ними практически не будет


        1. 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 - нет


  1. R0bur
    23.03.2024 04:13

    rm -rf ... /var/cache/*

    А вот это не слишком ли смело? Там всё-таки лежат данные не только APT.


    1. gudvinr
      23.03.2024 04:13

      Ну лежат и лежат, какая разница? В контейнере все равно кроме вашего процесса ничего не должно запускаться, и соответственно нечему генерить кеши


    1. dmitrmax Автор
      23.03.2024 04:13

      А что там ещё может лежать на этапе построения образа контейнера?


  1. aborouhin
    23.03.2024 04:13
    +2

    Я бы всё же попробовал ruffle для начала, прежде чем с некробраузерами развлекаться, хоть в докере, хоть без оного.


    1. dmitrmax Автор
      23.03.2024 04:13
      +1

      Эта штука для проигрывания условно игр на флеше. То есть когда у вас есть самодостаточный swf файл, который вы в неё загружаете и играете. С видеопроигрывателями на флеше это так не работает - для проигрывателя нужен видеопоток, который вы собираетесь собственно смотреть. Так что вы написали про первое, что нагуглили, совершенно не врубаясь в то, что вы нашли и как это применимо к задаче, сформулированной в первом абзаце.


      1. aborouhin
        23.03.2024 04:13
        +1

        Я его не нагуглил, я его давно использую. Причём в виде расширения к Firefox, которое запускает (ну, скажем так, пытается запустить) Flash-контент прямо на веб-страницах, без скачивания swf-файлов.

        А вот, кстати, если оно не сработает (что бывает), но конкретный flash-контент мне позарез нужен, - тогда буду выдёргивать swf и как-то пытаться его запустить на виртуальной машине, не имеющей подключения к интернету, ибо выпускать в инет устаревшую на N лет версию браузера - я не настолько... хм, скажем мягко, безрассуден :)


        1. dmitrmax Автор
          23.03.2024 04:13

          тогда буду выдёргивать swf и как-то пытаться его запустить на виртуальной машине

          Я же написал, что swf-проигрыватель не самодостаточная сущность. Где вы возьмете сам контент?

           не имеющей подключения к интернету

          Удачи вам в просмотре видеоплеера без контента )

          выпускать в инет устаревшую на N лет версию браузера - я не настолько... хм, скажем мягко, безрассуден :)

          А как вы думаете, для чего автор статьи запускает браузер в Docker-контейнере?


          1. aborouhin
            23.03.2024 04:13

            Ещё раз, ruffle работает как расширение в браузере и в некоторых случаях, даже если swf тянет поток откуда-то, он справится. И это самый предпочтительный сценарий, без старых дырявых браузеров и прочих костылей.

            Если же он не справляется - тут уже смотрим по ситуации. Контейнер безопасности, конечно, добавляет, но он не панацея ни разу. Я бы лучше одноразовую виртуалку завёл, если уж припрёт, с полным сбросом к исходному состоянию после остановки. А если прямо в оптовых количествах где-то нужные flash-видео лежат, которые ruffle не берёт, - можно копнуть причину поглубже и issue им на github'е открыть.


            1. dmitrmax Автор
              23.03.2024 04:13

              Ещё раз, ruffle работает как расширение в браузере и в некоторых случаях, даже если swf тянет поток откуда-то, он справится. И это самый предпочтительный сценарий, без старых дырявых браузеров и прочих костылей.

              Так не работает ваш ruffle в качестве расширения в браузере. Вы б хоть по ссылке из поста сходили б что ли, проверили бы прежде чем каменты строчить-то.

              Контейнер безопасности, конечно, добавляет, но он не панацея ни разу. 

              Ну допустим, автор флэш-а мог быть злобным какером и найти какую-то дырку, не закрытую в последней версии флэша, разместить его и ждать, пока клюнет. Но если он сделал комбо-эксплоит, который будет работать на ядрах и контейнерной обвязке в начале 2024-го, то моё почтение этому дону! )


  1. zorn-v100500
    23.03.2024 04:13

    В какой-то момент должна была быть и 88-ая, но не нашел где её добыть - если читатель подскажет, буду безмерно благодарен

    Открываем репу и смотрим доступные версии https://mirror.yandex.ru/ubuntu/pool/universe/c/chromium-browser/

    Вон есть 85.0.4183.83 из ближайших к 89


    1. dmitrmax Автор
      23.03.2024 04:13

      Только на размер посмотрите .deb файлов - они необычайно маленькие. А всё потому, что в какой-то момент, убунту решила отказаться от распространения нативных билдов хромиума в пользу snap store. То есть грубо говоря, то, что вы написал, это виртуальный пакет, который пустой внутри себя, но по зависимостям вытягивает уже snap-пакет. Готовы рассказать, как установить flash-плагин внутрь snap-а?


      1. zorn-v100500
        23.03.2024 04:13

        Точно, не обратил внимания. А полноценная только 90, да.

        Немного непонятно тогда зачем их держать в репе - snap отдельной жизнью живет и все равно обновит до последней версии.

        С дебианом тоже чуток не повезло, самая старая как раз 89 )

        А всё потому, что в какой-то момент, убунту решила отказаться от распространения нативных билдов хромиума в пользу snap store

        А следом и firefox с thunderbird. И переодически что то ломается - то шрифты, то курсоры, то уведомления.

        Thunderbird сейчас вообще сломан на бете 24.04 - нельзя отправить письмо (вернее даже сохранить черновик). Что то с профилями apparmor накосячили судя по всему.

        Готовы рассказать, как установить flash-плагин внутрь snap-а?

        Вообще думаю можно, но сама идея запускать snap в контейнере не то что попахивает, а пованивает )


        1. dmitrmax Автор
          23.03.2024 04:13

          Немного непонятно тогда зачем их держать в репе - snap отдельной жизнью живет и все равно обновит до последней версии.

          Ну вот стоял у вас пакет chromium-browser, а потом вы apt-get upgrade и нужно каким-то образом заменить этот пакет на chromium-snap. Для этого делают пустой пакет, его установка удаляет все файлы старого пакета, а в зависимостях ему прописывают новый пакет - таким образом, вытягивается другая сборка. А юзер типа не замечает - что был у него хромиум до, что остался после, только более новый.


          1. zorn-v100500
            23.03.2024 04:13

            Это понятно, непонятно зачем пакет с 85й версией. Ну держали бы один transitional пакет последней версии.


            1. dmitrmax Автор
              23.03.2024 04:13

              А какая разница какой он версии? Главное, чтобы эта версия была выше, чем версия у пакета с нативной сборкой. Тогда эта версия обновится и вытащит по зависимостям самую последнюю версию snap-сборки.


  1. 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/


    1. dmitrmax Автор
      23.03.2024 04:13

      Зачем обманывать?

      Где это тут вас кто-то обманывает? На указанной в посте версии поведение именно такое.

      Проще поставить последнюю версию без тайм-бомбы 32.0.0.371:

      Замечательно, спасибо за инфу, но я лично не знал, в какой момент заложили таймбомбу.


      1. Johan_Palych
        23.03.2024 04:13

        Под "Зачем обманывать?" имелось в виду не то, что Вы обманываете, а установка faketime.


        1. dmitrmax Автор
          23.03.2024 04:13

          Аааа, пардон.