

  * ホストOS： ベアハードで動いているubuntu-desktop 18.04
  * dockerイメージ： ubuntu-desktop 18.04に使いたい開発ツールとライブラリをインストールしたもの

という構成で、dockerコンテナの中で動いているqtcreatorの中で、日本語入力ができません。  
具体的な症状としては、全角/半角を押しても入力のインジケータが「A」から「あ」に変わりません。  
ホストOS側のqtcreatorではできています。qtcreatorはubuntuのディストリビューションに含まれるものです。

ubuntuのデフォルトだと思いますがibus-mozcを使っています。

関係すると思っている環境変数は以下のようになっています。

QT_IM_MODULE=ibus  
LANG=ja_JP.UTF-8

dockerコンテナの中にインストールしているパッケージとして、直接関係していると思っているものには以下のものがあります。

  * qtcreator
  * ibus
  * ibus-mozc

コンテナ起動時には、意味があるか理解できていませんが /tmp/.XIM-unix をマウントしています。

ibusがどうやって通信しているのか分かってないので（自分なりに調べたのですが）、  
ibusによる通信を実現するためのソケットやポートはつなげていません。

この状態で、コンテナの中で、以下のことができていたりできていなかったりします：

  * コンテナ内で起動した xfce4-terminal でibusによる日本語入力ができる
  * コンテナ内で起動した emacs25 でibusによる日本語入力ができる
  * コンテナ内で起動した eclipse 2019-12 CDT で、日本語入力ができる
  * コンテナ内で起動した qtcreator では日本語入力できない

何か見落としている／誤解していることはありますでしょうか?

## 追記

投稿後も調べ続けた結果、基本的なことが分かりました。

  * ibus は通信に "dbus" を使う。ibusはdbusのアプリケーションである。
  * dbusは通信にunix domain socketを使う。それも、普通のファイルシステムとしては見えないabstract path を使う。
  * abstract pathは network namespace ごとに独立なので、普通にdocker container を使うときはホストとコンテナの中で分離されているので、見えない。 <https://stackoverflow.com/questions/38455283/docker-containers-share-unix-abstract-socket-or-dbus>

となると、コンテナの中でibusが使えているように見えたものは、ibusの通信ができていたわけではないのだと思います。ibusサーバは"xim"のサーバも兼ねるようですので、"xim"としての通信をしているのかな、と推測しています。


CC BY-SA 4.0
2020-08-12T10:19:02.003
69486
2020-08-12T13:45:01.043
2020-08-12T13:20:29.170
40200
40200
question
docker qt
Ubuntu18.04 上のdockerコンテナに入れたqtcreatorでibusによる日本語入力ができない


自己回答します

ホストで動いているibusデーモンを使って、dockerコンテナ内で動いているデスクトップアプリ上で日本語入力をするのは困難であることが分かりました。理由はibusがdbusを応用したプロトコルを使っているためです。

そのかわりに、fcitxを使った変換なら動きましたのでそちらを紹介します。  
fcitxは、普通のunixドメインソケット（パスがファイルシステム上に実在するソケット）を使っているようなので、そのソケットさえdockerコンテナ内にマウントしておけば、通信が可能です。

## やること

### fcitx のインストール

ホストOS側には、私の場合は勝手にインストールされました。fcitxとibusの双方がインストールされているので、fcitxが使われるように（fcitxのデーモンが起動されるように）設定する必要があります。

「設定 | 言語とサポート」で「キーボード入力に使うIMシステム」のプルダウンで「fcitx」を選びます。

Docker
イメージの中にはfcitxのバイナリをインストールします。変換デーモンはホストOSのものを使うので、フロントエンドのパッケージだけ入れればOKです。私は
Dockerfile の中で

[code]

    apt-get install -y fcitx-frontend-all
    
[/code]

と指定しました。

### docker runでの指定

dockerコンテナ起動時にfcitxがリクエストを受け付ける unix domain ソケットである /tmp/fcitx-socket-:0
をマウントします。docker run の --volume オプションでは、パス名にコロンが含まれているケースを扱えないので、 --mount
オプションを使います（https://stackoverflow.com/questions/44938108/unable-to-map-docker-
volume-with-colon）  
fcitxが使われるようにするための環境変数もホストから引き継ぎます。

[code]

    docker run ...中略... \
       --env="QT_IM_MODULE" \
       --env="QT4_IM_MODULE" \
       --mount type=bind,source=/tmp/fcitx-socket-:0,destination=/tmp/fcitx-socket-:0 \
       ...後略
    
[/code]

これでコンテナ内のqtcreatorで日本語入力ができるようになりました。


CC BY-SA 4.0
2020-08-12T13:45:01.043
69497
2020-08-12T13:45:01.043
40200
69486
answer