我想跑步Firefox 84.0(最新版本支持Flash播放器)支持Flash播放器在一个docker 容器。但是 Firefox 无法检测到位于路径“~/.mozilla/plugins”中名为“libflashplayer.so”(Shockware Flash 25.0) 的 Flash Player 插件。我在“about:addons”或“about:plugins”中找不到它,只有“OpenH264”插件在那里。
首先,也是最重要的,我曾尝试在我的真实系统上运行带有 Flash Player 的 Firefox(Debian 12 Linux 6.1.0-17-amd64)和 VirtualBox 中的虚拟机,它们都工作正常。但是当 Firefox 在容器中运行时(docker 版本:25.01,来自 ubuntu 的镜像:22.04 amd64),它找不到 flash player 插件。创建镜像和容器的过程如下:
#Dockerfile
From ubuntu:22.04
ENV MOZ_DISABLE_CONTENT_SANDBOX=1
WORKDIR /root
RUN apt update && apt install -y wget ......(some other libraries are needed) && \
wget xxxx/firefox-84.0.tar.bz2 && tar jxvf firefox-84.0.tar.bz2 && rm *tar.bz2 && \
mkdir -p .mozilla/plugins
COPY libflashplayer.so .mozilla/plugins
ENTRYPOINT ./firefox/firefox
#image-bulid.sh
docker build -t firefox .
#container-run.sh
docker run --rm -v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=unix$DISPLAY --device /dev/dri firefox
顺便说一下,关于环境变量“MOZ_DISABLE_CONTENT_SANDBOX”,没有它,我无法运行旧版本的 Firefox,我从中找到它https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1020894
我搜索了这个问题并尝试了一些解决方案,例如:
- 将 libflashplayer.so 复制到 /usr/lib/firefox/plugins、/usr/lib/mozilla/plugins 和其他位置我从许多答案中发现“Firefox 插件的位置在哪里”和“为什么 flashplayer 不工作”
- 使用其他版本的 Firefox,例如 Firefox 83.0
- 由于 Firefox 可以检测到我的真实系统上运行的插件,因此我尝试在容器中创建一个相同的用户,并将我真实机器中的所有 Firefox 文件(如“~/friefox/”、“~/.mozilla/”和“~/.cache/mozilla/”)复制到具有原始模式的容器中(使用“docker cp -a”)。用户配置文件有效,但 Firefox 仍然没有 Flash Player。我从“about:support”导出数据,以下是同一个 Firefox 在真实系统中运行和在容器中运行之间的区别:
手动添加“plugin.flash.xxx”之类的首选项是没有用的,Firefox 会覆盖它们。test@test:~$diff support-real.json support-container.json 29a30 > "web": 1, 38,39c39,40 < "DISPLAY": ":0.0", < "MOZ_ASSUME_USER_NS": "1", --- > "DISPLAY": "unix:0.0", > "MOZ_ASSUME_USER_NS": "0", 41c42 < "MOZ_CRASHREPORTER_RESTART_ARG_0": "/home/test/firefox/firefox", --- > "MOZ_CRASHREPORTER_RESTART_ARG_0": "./firefox/firefox", 75,77d75 < "plugin.flash.arch": "x86_64-gcc3", < "plugin.flash.blockliststate": 0, < "plugin.flash.desc": "Shockwave Flash 25.0 r0", 80,81d77 < "plugin.flash.path": "/home/test/.mozilla/plugins/libflashplayer.so", < "plugin.flash.version": "25.0.0.127", 225c171 < "hasUserNamespaces": true, --- > "hasUserNamespaces": false,
- 我曾尝试在 Debian、Centos 和不同容器镜像上运行 Firefox 的其他浏览器分支,但在容器中检测不到插件。
我还没有尝试将其他插件放到路径“~/.mozilla/plugins”来确定密钥是否是“容器中的 Firefox 无法检测到任何插件”或“容器中的 Firefox 无法检测到 Flash Player”,因为我找不到任何其他插件来测试。
那么为什么同样的Firefox进程和同样的flash player插件在整个系统(真机和虚拟机)中运行和在docker容器中运行会有区别,如何让它工作呢?
答案1
这不是您遇到的 docker 问题的解决方案,但我强烈建议您使用 Flash 模拟器。
另请查看这个关于模拟的优质来源: https://emulation.gametechwiki.com/index.php/Flash#Implementations
如果你确实需要支持 Flash 的浏览器,可以考虑安装 Waterfox Classic、Pale Moon 或 K-Meleon。它们是 Mozilla Firefox 的分支,内置 Flash Player 支持(来源:上面链接的 Clean Flash 网站)。
答案2
最后,我终于找到了解决办法,这只是一个问题缺少依赖包。
- 确保不要丢失依赖包插件:
ldd /path/to/libflashplayer.so | grep "not found"
- 然后安装缺少的软件包:
apt install xxx
- 不要忘记删除或修改Firefox 的插件配置文件:
rm ~/.mozilla/firefox/xxx.defalut-release/pluginreg.dat
或者更改插件的路径和export MOZ_PLUGIN_PATH=/NEW_PATH/TO/PLUGIN
。(Firefox 使用文件来注册已经检测到的插件,它将不检查被标记为“无效的”。)
我的结论是:
- 就我的情况而言,在 Docker 容器中运行的程序与在整个系统中运行的程序之间的区别很明显,就是它们的环境。容器是不是具有完整软件包的操作系统就像我们通常使用的操作系统一样。这就是为什么我的主机或虚拟机中带有 Flash 的 Firefox 可以工作,而在容器中却不能工作的原因。
- 在日常使用中,当某个程序启动失败时,通常会提示“xxx.so 未找到”或“xxx.dll 丢失”之类的错误信息。但当 Firefox 加载 Flash Player 失败时,没有提醒,无论是 Firefox 还是 Flash 播放器。
- 大多数情况下,插件或应用程序都是使用完全依赖包打包的。我从来没有想过,Flash插件只是一个共享对象,需要其他文件。我在Firefox的路径中搜索了一些关键字,找到了名为“插件注册文件' 导致 libflashplayer.so 被屏蔽为无效。然后我扫描了 Firefox 的源代码,发现 Firefox 会检测一些路径来注册和加载插件。通过调试,我发现 Firefox 无法加载动态链接库“libflashplayer.so”,我的意思是函数“LoadLibrary()”返回错误,这就是问题所在。