最近Dockerを使っていろいろなものを仮想化するのにはまっており、その産物です。
動機としては、普段使いしているArch Linuxで、emacs-mozc
の日本語入力ができないということです。
Docker内にEmacsをインストールして、Emacsの画面をホスト側に映してやろうっていう魂胆です。
環境
- ホストOS:Arch Linux
- ゲストOS:Debian GNU/Linux ベース
- Docker version: 1.12.1
手順
まずはDockerfile
。至極単純です。もうちょっとカスタマイズして、emacs-mozc
を入れたりしたい。
FROM debian:latest
RUN apt-get update
RUN apt-get -y install emacs24
RUN useradd -G sudo -u 1000 --create-home emacs
ENV HOME /home/emacs
WORKDIR /home/emacs
CMD /usr/bin/emacs --reverse
このDockerfile
があるディレクトリで、docker build --tag emacs .
でビルドします。
次に、Emacsの起動スクリプトを作り、パスの通ったところに設置します。
#!/bin/bash
xhost +local:
docker run -it --rm \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v $HOME:/home/emacs/host_home \
-e DISPLAY=$DISPLAY \
--user 1000 \
emacs
xhost -local:
環境変数でディスプレイを与えているのと、/tmp/.X11-unix
をマウントしてXのソケット通信を可能にしています。
あとは起動するだけです。
emacs-docker
こんな感じになりました。ちゃんと動いています。
dired
でディレクトリを確認。ちゃんと、ホスト側の$HOME
がコンテナ内にマウントされています。
UIDが一致しているので、Docker実行ユーザー(ここではEmacs)の所有ファイルと認識されています。
注意点
- HOSTのUIDとコンテナ内のUIDが同一でないと、権限の問題が発生してファイルの編集、作成ができなくなります。
- DockerやLXCでは、シンボリックリンクが使えないようです。これは場合によってはけっこう面倒。
半分ネタですが、積極的に使っていこうかなと。
追記
@mapk0y
マウントするのは "/tmp" ではなく "/tmp/.X11-unix/" だけのほうが良い気もする。あと スクリプトの最後で "xhost -local:" したほうがいいかも。
というコメントをはてなの方でいただきました。
自分も最初/tmp/.X11-unix/
をマウントしましたが、なぜかうまくいかなかったので/tmp
ごとマウントしてしまいました。雑ですいません。
通常は/tmp/.X11-unix/
だけで良いはずですので、そのように修正しました。ありがとうございます。
"xhost -local:"も追記しておきました。
/tmp/.XIM-unix
というディレクトリもあるので、もしかしたらXIMの機能だけ仮想環境に置いとくとかもできるんですかね。
夢が広がりますね。