docker上で起動したfirefoxをホスト側で操作する
前回、簡単なX11アプリケーションをdocker上で起動、host側に表示することができましたが、もう少し踏み込んでブラウザを使えるようにします。
結論から言うと、普通に閲覧できるようになりましたが、日本語入力ができなかったり、開いたページによっては途中でクラッシュしてしまったり課題が残っています。
環境
前回と同じで、ホスト・コンテナともに Ubuntu 18.04 です。
今回はdocker-composeを使います。
まずは簡単に動かしてみる
シンプルに以下を実行する
Dockerfile
FROM ubuntu:18.04 RUN apt-get update RUN apt-get -y install firefox ENTRYPOINT "firefox"
xhostの設定
xhost + local:root
docker-compose.yml
version: '3' services: firefox: build: . volumes: - /tmp/.X11-unix/:/tmp/.X11-unix/ environment: - DISPLAY=$DISPLAY
課題
上記でも動きますが、ホスト側と同じように動かためにはいくつか課題があります。
- 日本語が文字化けしている(麻雀牌化する)
- データが永続化されていない
- 時刻がutc
- 音が出ない
- 日本語入力できない
それ以外にも、起動時にwarningなどのメッセージも出てきたり、たまにクラッシュしたりします。
課題を解決していく
warningが出ている
まずは、warningが出ているので対応していきます。
firefox_1 | (firefox:6): LIBDBUSMENU-GLIB-WARNING **: 08:26:42.616: Unable to get session bus: Failed to execute child process ?dbus-launch? (No such file or directory)
dbus-launch
は、dbus-x11
というパッケージに入っているということなので、これをインストールして対応しました。
https://launchpad.net/ubuntu/bionic/+package/dbus-x11
firefox_1 | Gtk-Message: 11:37:45.029: Failed to load module "canberra-gtk-module"
これは、libcanberra-gtk-module
と libcanberra-gtk3-module
をインストールして対応。
gtkはGUI関連のライブラリとのこと https://developer.gnome.org/gtk3/stable/
日本語が文字化けしている(麻雀牌化する)
language-pack-ja
と日本語フォントをインストールすれば解決
ついでに、localeの対応もします。
利用可能な全ロケールを確認
$ locale -a C C.UTF-8 POSIX ja_JP.utf8
ja_JP.utf8
はフォントインストールしたときにはいったのかな?
ロケール環境変数に ja_JP.utf8
をセットするようにします。
LC_ALL=ja_JP.utf8
参考: https://lpi.or.jp/ex/102/ex_2901.shtml
データが永続化されていない
ホストのどっかに退避するだけです。 私は $HOME 以下と同期させるようにしました。
$HOME/.mozilla/:/home/user/.mozilla/ $HOME/ダウンロード/:/home/user/ダウンロード/ $HOME/.cache/:/home/user/.cache/
時刻がutcである
ホスト側(JST)と合わせます。
/etc/localtime:/etc/localtime
音が出ない
ホスト側では、pulseaudio というサウンドサーバが動いていて、ソケット経由で音声のやりとりができるというこいとでこの方法で対応します。
こちらの記事を参考にさせていただきました。 https://wafrelka.hatenablog.jp/entry/2016/04/16/233940
以下のファイルを共有し、
/run/user/[uid]/pulse/native /home/user/.config/pulse/cookie
環境変数にもセットします。
PULSE_SERVER=/run/user/[uid]/pulse/native PULSE_COOKIE=/home/user/.config/pulse/cookie
日本語入力できない
日本語の入力ができないというよりも、ホスト側のインプットメソッドの設定が反映されません。 インプットメソッドの仕組みまだよくわかっていので、まずはそこからかな。
たまにクラッシュする
未解決ですが、以下のようなメッセージがでるので引き続き確認してきます。
firefox_1 | [Parent 6, Gecko_IOThread] WARNING: pipe error (181): 接続が相手からリセットされました: file /build/firefox-DVGW0d/firefox-65.0.1+build2/ipc/chromium/src/chrome/common/ipc_channel_posix.cc, line 349 firefox_1 | firefox_1 | ###!!! [Parent][MessageChannel] Error: (msgtype=0x1E0086,name=PBrowser::Msg_Destroy) Channel error: cannot send/recv
まとめ
設定はこちらにまとめています。 github.com
こんな感じで試行錯誤しながら進めています。 日本語入力ができない件については、他のアプリケーションをdockerで動かす場合でも同じ問題が発生すると思うので、早めになんとかしていきたい気持ち。