在Archlinux上的网易云音乐成功以白屏、歌词不显示、右键菜单崩溃宣告离开我的电脑之后,我发现Docker可以运行GUI程序,就用Docker成功运行了网易云音乐,造福一波Arch上的网易云音乐用户XD。
在Docker中运行GUI程序
显示问题
目前,很大一部分Arch用户都仍使用X作为Window System(当然Wayland也已经占据很大一部分市场份额),我暂时也是其使用者之一,因此只对X做了一些简单的适配,而且网易云音乐是可以被我们一定程度上信赖的软件,安全问题未考虑在内。
众所周知,X Server与X Client通信的最简单的方式,是使用Unix-domain Socket,X Server把它的Socket放在/tmp/.X11-unix
下,以文件的形式存储。因此,首先要把该目录挂载到容器中。
参数为:-v /tmp/.X11-unix:/tmp/.X11-unix
同时,为了使X Client能正常的找到X Server, 环境变量$DISPLAY
也必须传入容器中。这个变量是X Window System 很魔幻的一个Feature,它的值为hostname:sequence_number.screen_number
,通过它X Client才能够知道如何把X Network Traffic重定向到本地的X Server。
参数为:-e DISPLAY
另外,为了使Docker容器中的用户能够正常访问,还需要Xhost提供本地的访问权限(这也是最终唯一的额外依赖包xorg-xhost的来源)。
命令为:xhost + local:
这样就可以正常地显示啦w。
声音问题
声音问题同理可得,通过查阅PulseAudio的文档,可以知道$XDG_RUNTIME_DIR/pulse/native
需要挂载进容器中,而变量$PULSE_SERVER
也必须传入容器中,原理不再赘述。为了使声音设备能够被正常访问,还需要把/dev/snd
挂载进容器中。
参数如下:
1 | -v ${XDG_RUNTIME_DIR}/pulse/native:${XDG_RUNTIME_DIR}/pulse/native \ |
网络问题
由于容器需要与外部共享网络,这里使用Docker的参数--ipc host
就可以完成。
指针问题
XOrg默认的指针难看得令人发指= =!为了解决指针的问题,需要将用户的/usr/share/icon
挂载到容器的相同位置,这样就可以使Docker中的GUI程序与系统环境共用鼠标指针。
参数为:-v /usr/share/icons:/usr/share/icons:ro
网易云音乐的依赖解决
选用Ubuntu 16.04 作为Docker 的 Base。
1 | FROM docker.io/ubuntu:16.04 |
查看AUR中网易云音乐的依赖,并没有发现任何有用的信息,猜想着安了一个文泉驿的中文字体,然后把环境变量LANG
设置成了中文,依然无法正常运行。
对报错信息稍微搜索一下,发现使用D-Bus进行一些奇怪的通信,于是安装了dbus-x11
和packagekit
,又发现提示音导致的一些Warning,就安装了libcanberra
。
1 | apt-get install -y --no-install-recommends wget dbus-x11 libcanberra-gtk-module fonts-wqy-zenhei packagekit-gtk3-module |
其他的过程毫无悬念,按照正常.deb
包安装即可2333
在Docker中运行网易云音乐
这是第一次完全靠自己手写Dockerfile,之前都是对着各种现成的Dockerfile Copy&Paste,踩了一点坑QAQ。
apt-get install
一定要使用--no-install-recommends
,这样可以大大减小最终体积。- 在下载完一个不再使用的文件或者软件包之后一定要在同一个
RUN
中把它移除掉,避免无谓的占用。 - 大部分情况下
RUN
可以并在同一条命令中完成,避免多余的commit占用体积。 CMD
命令["command","args"...]
是非常实用的简化书写的方法,在很多情况下优于ENTRYPOINT
。
此外,配置文件夹、缓存文件夹和默认音乐文件夹也都挂载到相同位置。
参数为:
1 | -v $HOME/.config:/root/.config \ |
PKGBUILD打包上传
PKGBUILD
并不难写,有问题的是.install
脚本,以前没有接触过所以不怎么了解。
.install
脚本中不能出现任何和用户交互的命令,踩坑owo。PKGBUILD
中的函数是在fakeroot
下运行的,但是.install
并不是,可以理解为是在真实sudo
环境下运行的脚本,所以什么都能做到w。- 要想使普通用户正常使用Docker,需要将其加入
docker
用户组中,但是刷新用户组只能通过重新登录来解决,为了方便起见,甩给安装者一个Warning,并在之后的启动脚本中加入sg
,避免了安装后的重启。
大胜利
然后就结束了,体验成功++,欢迎各位食用和提issue,netease-cloud-music-docker-version
已加入AUR中。