Open6
Docker内(Alpine Linux)でブラウザを動かす
まぁheadlessブラウザの類いはいくらでもあるけど、こっちはリモートデスクトップのRemoteAppだからな。。
ブラウザとしてはWebKit GTKベースのEpiphany(GNOME Web)を使っている。
apk add epiphany dbus-x11 mesa-egl mesa-dri-gallium
フォントが無いと割と無惨に死ぬ
もうちょっと普通に死んでくれた方が。。
Gsk:ERROR:../gsk/gl/gskglcommandqueue.c:599:gsk_gl_command_queue_begin_draw: assertion failed: (height <= G_MAXUINT16)
Bail out! Gsk:ERROR:../gsk/gl/gskglcommandqueue.c:599:gsk_gl_command_queue_begin_draw: assertion failed: (height <= G_MAXUINT16)
Thread 1 "epiphany" received signal SIGABRT, Aborted.
確かに、 fc-list
で確認してみると、fontconfigが認識しているフォントが1つも無い。
/ $ fc-list
/ $
apk add font-noto-all font-noto-cjk
font-noto-all
に CJKが含まれてないのは割と罠なんではないか。。
Sandboxを切らないと実行できない
bwrap: No permissions to creating new namespace, likely because the kernel does not allow non-privileged user namespaces. On e.g. debian this can be enabled with 'sysctl kernel.unprivileged_userns_clone=1'.
** (epiphany:181): ERROR **: 12:46:19.977: Failed to fully launch dbus-proxy: Child process exited with code 1
これはWebKit側のsandboxだと思う。環境変数で切れる。まぁDockerにしてる段階でsandboxしてるわけだし。。
export WEBKIT_DISABLE_SANDBOX_THIS_IS_DANGEROUS=1
挙動が謎
何故か左上隅じゃないとリサイズできない。普通逆じゃない。。?
あとソフトウェアレンダリングなので当然遅い。
Waylandとアプリのコンテナを分ける
まぁ普通に
# apk add epiphany dbus-x11 mesa-egl mesa-gles mesa-dri-gallium xhost font-noto font-noto-cjk
# export DISPLAY=:0
# export XDG_RUNTIME_DIR=/tmp
# export GDK_BACKEND=wayland
# chmod 777 /tmp/wayland-0
# chmod 777 /tmp/.X11-unix/X0
# xhost +local:
# export WEBKIT_DISABLE_SANDBOX_THIS_IS_DANGEROUS=1
だけしておけば、Waylandコンポジタが居るコンテナと実際にブラウザが動くコンテナは別で良い。ただし、D-BusがX11に依存しているので、Wayland側にXサーバーが必須。
WSL1で試してみるとクラッシュする
X11だと大丈夫なので、これはWSL1のエミュレーション精度の問題っぽいな。。
Thread 1 "epiphany" received signal SIGSEGV, Segmentation fault.
memcpy () at src/string/x86_64/memcpy.s:18
warning: 18 src/string/x86_64/memcpy.s: No such file or directory
(gdb) bt
#0 memcpy () at src/string/x86_64/memcpy.s:18
#1 0x00007ffff3de489f in ??? () at /usr/lib/libEGL.so.1
#2 0x00007ffff3de4bd7 in ??? () at /usr/lib/libEGL.so.1
#3 0x00007fffa5ceede5 in ??? () at /usr/lib/xorg/modules/dri/zink_dri.so
#4 0x00007fffa5d0775c in ??? () at /usr/lib/xorg/modules/dri/zink_dri.so
#5 0x00007ffff3ddfe3b in ??? () at /usr/lib/libEGL.so.1
#6 0x00007ffff3dd63e9 in ??? () at /usr/lib/libEGL.so.1
#7 0x00007ffff3dc7aa6 in ??? () at /usr/lib/libEGL.so.1
#8 0x00007ffffee7e25c in ??? () at /usr/lib/libgtk-4.so.1
#9 0x00007ffffee2b511 in ??? () at /usr/lib/libgtk-4.so.1
#10 0x00007ffffee72917 in gdk_draw_context_end_frame () at /usr/lib/libgtk-4.so.1
#11 0x00007ffffeeb84ad in ??? () at /usr/lib/libgtk-4.so.1
#12 0x00007ffffee98852 in gsk_renderer_render () at /usr/lib/libgtk-4.so.1
#13 0x00007ffffec86aed in ??? () at /usr/lib/libgtk-4.so.1
#14 0x00007ffffec8e266 in ??? () at /usr/lib/libgtk-4.so.1
#15 0x00007ffffee15c35 in ??? () at /usr/lib/libgtk-4.so.1
#16 0x00007fffff5dece3 in ??? () at /usr/lib/libgobject-2.0.so.0
#17 0x00007fffff5dedd3 in g_signal_emit_valist () at /usr/lib/libgobject-2.0.so.0
#18 0x00007fffff5dee90 in g_signal_emit () at /usr/lib/libgobject-2.0.so.0
#19 0x00007ffffee8c69c in ??? () at /usr/lib/libgtk-4.so.1
#20 0x00007fffff5dece3 in ??? () at /usr/lib/libgobject-2.0.so.0
#21 0x00007fffff5dedd3 in g_signal_emit_valist () at /usr/lib/libgobject-2.0.so.0
#22 0x00007fffff5dee90 in g_signal_emit () at /usr/lib/libgobject-2.0.so.0
#23 0x00007ffffee7b018 in ??? () at /usr/lib/libgtk-4.so.1
#24 0x00007fffff4ba31a in ??? () at /usr/lib/libglib-2.0.so.0
#25 0x00007fffff4b917a in ??? () at /usr/lib/libglib-2.0.so.0
#26 0x00007fffff51a547 in ??? () at /usr/lib/libglib-2.0.so.0
#27 0x00007fffff4b747e in g_main_context_iteration () at /usr/lib/libglib-2.0.so.0
#28 0x00007fffff344b96 in g_application_run () at /usr/lib/libgio-2.0.so.0
#29 0x000000000800386e in main ()
(gdb)