众所周知,网易云音乐和深度 Linux 合作推出了 Linux 版的网易云音乐,可惜
- 它是闭源的
- 只支持 deepin 15、Ubuntu 16.04 和 Ubuntu 14.04
为了能在任意 Linux 桌面下运行,以及避免闭源软件对系统造成影响,我尝试把它打成了 Docker image (基于 Ubuntu 16.04 )。 其实本来想打一个 flatpak 包,但是失败了(补了一堆依赖,不知道还有没有遗漏的,最后还报 udev 错误--!)。
其实思路很简单,把二进制软件包及没有列出的依赖装进 image 后,主要解决以下问题(docker-compose.yaml 和 Dockerfile见https://github.com/vfreex/docker-netease-cloud-music):
- 在 Docker 里跑 GUI 程序: 主要参考了 https://stackoverflow.com/questions/16296753/can-you-run-gui-apps-in-a-docker-container。 核心只有三点:
- 挂载 host 上的
/tmp/.X11-unix到 container 里的同一路径 - 将环境变量
DISPLAY从 host 传到 container - 禁掉 SELinux (主要是懒得折腾 SELinux 的权限设置了)
- 在 Docker 里输出声音 主要参考了 https://stackoverflow.com/questions/28985714/run-apps-using-audio-in-a-docker-container 核心也有三点:
- 挂载
$XDG_RUNTIME_DIR/pulse/native到 container - 设置环境变量
PULSE_SERVER为上一条中 container 里面挂载的路径 - 挂载
/dev/shm到 container 里的同一路径
- 给 container 中不存在用户名的 uid 分配用户名: 主要参考了 https://docs.openshift.org/latest/creating_images/guidelines.html#openshift-origin-specific-guidelines
我们希望 container 中运行程序的 user 和 host 的 uid 相同,以便访问用户 home 目录下的音乐库。
默认情况下,只挂载了 $HOME/.config/netease-cloud-music、$HOME/Music/CloudMusic 和$HOME/Music(只读),其它路径对 container 不可见(docker-compose.yaml)。
运行
确保你已安装并配置好了docker和docker-compose,下载
https://raw.githubusercontent.com/vfreex/docker-netease-cloud-music/master/docker-compose.yaml, 进入下载到的目录,运行xhost +local && docker-compose up -d。