docker上で起動したfirefoxをホスト側で操作する

前回、簡単なX11アプリケーションをdocker上で起動、host側に表示することができましたが、もう少し踏み込んでブラウザを使えるようにします。

takapi86.hatenablog.com

結論から言うと、普通に閲覧できるようになりましたが、日本語入力ができなかったり、開いたページによっては途中でクラッシュしてしまったり課題が残っています。

環境

前回と同じで、ホスト・コンテナともに 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-modulelibcanberra-gtk3-module をインストールして対応。

gtkGUI関連のライブラリとのこと 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で動かす場合でも同じ問題が発生すると思うので、早めになんとかしていきたい気持ち。

参考

https://github.com/jessfraz/dockerfiles