Docker for Macのコンテナでターミナルを起動する

Docker for Macでxclockを表示する」でxclockが表示できたので、次はターミナルを起動してみます。

Bash on Windowsでもurxvtを使っていたので、同じくターミナルはurxvtにします。
他にBash on Windowと同じように下記の日本語環境を作ります。

  • urxvt
  • tmux
  • emacs

Macだと標準のターミナルや、マカーのほとんどが使っているiTermがありますが、Windows環境とのインターフェースの共通化やMacの設定のコンテナへの組み込みを考えて、コンテナにターミナルを用意します。

作ってみる

いきなりDockerfileでイメージ作成

Docker for Macでxclockを表示する」のDockerfileのx11-appsをurxvt(rxvt-unicode-256color)に変えただけです。

FROM ubuntu:18.04
MAINTAINER crz33 <crz33.com>
RUN apt-get update && apt-get install -y \
  rxvt-unicode-256color
CMD urxvt -e /bin/bash

これをもとにイメージを作ります。

$ docker image build -t crz33/terminal .

コンテナ作成・起動

下記で起動します。

$ docker container run -it -e DISPLAY=${HOSTNAME}:0 -v /tmp/.X11-unix:/tmp/.X11-unix -name terminal crz33/terminal

起動できました。

urxvt

問題点

作ってみたけど、問題が4つありました。

  • コピペできない
  • CtrlがMacのCommandになっている(原因:Karabiner)
  • 日本語表示できない
  • 日本語入力できない

解決:コピペできない

原因調査

コンテナのurxvtに対し、Macからペースト(貼り付け)できない問題が起きました。

Xquartzの環境設定の「ペーストボード」を見ると、クリップボードはX11と同期できるようです。

あとは、urxvt側ですが、3ボタンマウスの中ボタンが貼り付けの操作ですが、Mac側ではトラックパッドを使っていてマウスではないので、中ボタンを押せないことがそもそもの原因でした。

WindowsでBash on Windowsを使っていたときは、Windowsなので当然マウス使っていたので違和感なく中ボタンを押していたのだと思います。

解決策

Xquartzの環境設定の「入力」の最上位に「3ボタンマウスをエミュレート」というオプションがありました。これを使うと、「Option+クリック」で中ボタンとなるようエミュレートできます。

ですが、option押しにくいですね。他の方法として、BetterTouchToolでのジェスチャー追加で中ボタンを発生できます。僕はBetterTouchToolを使っているので、こっちを使っています。

設定は、TrackPadの「3 Finger Click」で「middle click」を発生させています。

追記

Xquartzの環境設定の「ペーストボード」で、最下部の「新しいテキストが選択されたら、すぐにペーストボードをアップデート」にチェックを入れておかないと、コンテナからMacへのペーストボードの反映ができません。

解決:CtrlがMacのCommandになっている

原因

KarabinerでiTerm2以外はCtrlとCommandoを入れ替えています。これが原因でした。
Ubuntu側では
* MacのCtrlがCtrl
* MacのCommandがAlt
になるようです。

解決策

KarabinerのCtrlとCommandの入れ替えをiTerm2に加えて、Xquartzも除外対象にします。

Xquartzのアプリ名は”org.macosforge.xquartz.X11″です。KarabinerのEventViewerで確認できます。

これを設定ファイルに書き込みました。興味のある方は書きを見てください。

MacのCtrlとCommandを入れ替える

解決:日本語表示できない

原因

日本ロケールの設定ができていないためです。
あと、日本語だけでなくタイムゾーンもUTCになってしまってました。

解決

必要な設定とパッケージは、Dockerfile形式では下記です。

RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN echo 'Asia/Tokyo' > /etc/timezone

RUN apt-get update && apt-get install -y \
  language-pack-ja \
  tzdata

ENV LANG=ja_JP.UTF-8 \
    LANGUAGE=ja_JP.UTF-8 \
    LC_ALL=ja_JP.UTF-8

解決:日本語入力できない

原因

コピペで日本語入力できますが、IMは連携できないようです。

解決

現状、解決策なしです。

lxdeなどウィンドウマネージャまで入れて、VNCで接続するまで作り込むのであれば、fcitx-mozcなど入れればよいかと思いますが、urxvt+tmux+emacs程度なので、そこまでやるのは諦めました。

Bash on Windowsの環境と同じようにemacsだけ日本語入力することにしました。

emacsの日本語入力はBash on Windows で emacsと日本語入力できるようにするを参照してください。

最終的なDockerfile

mac側のファイルも直接扱えるようにユーザ追加もしています。
DEV_USER_IDをMAC側のIDと揃えれば、直接メンテできます。

FROM ubuntu:18.04

MAINTAINER crz33 <crz33.com>

RUN sed -i.bak -e "s#http://archive.ubuntu.com/ubuntu/#http://ftp.riken.jp/pub/Linux/ubuntu/#g" /etc/apt/sources.list
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN echo 'Asia/Tokyo' > /etc/timezone

RUN apt-get update && apt-get install -y \
  sudo wget less bzip2 net-tools \
  language-pack-ja \
  tzdata \
  rxvt-unicode-256color \
  tmux \
  emacs-nox emacs-mozc emacs-mozc-bin

# 環境変数
ARG DEV_USER_ID=501
ARG DEV_USER_NAME=dev
ARG DEV_GROUP_ID=1000
ARG DEV_GROUP_NAME=dev

# ユーザ追加
RUN groupadd -g $DEV_GROUP_ID $DEV_GROUP_NAME \
 && useradd -d /home/$DEV_USER_NAME -m -s /bin/bash -u $DEV_USER_ID -g $DEV_GROUP_ID $DEV_USER_NAME \
 && echo "$DEV_USER_NAME:$DEV_USER_NAME" | chpasswd \
 && echo "$DEV_USER_NAME ALL=NOPASSWD: ALL" >> /etc/sudoers

# ユーザ変更
USER $DEV_USER_NAME
WORKDIR /home/$DEV_USER_NAME

# 日本語
ENV LANG=ja_JP.UTF-8 \
    LANGUAGE=ja_JP.UTF-8 \
    LC_ALL=ja_JP.UTF-8

CMD urxvt -e /bin/bash

これでてきたイメージを下記のようにコンテナ生成・起動すれば使えます。

$ docker container run -it -e DISPLAY=${HOSTNAME}:0 -v /tmp/.X11-unix:/tmp/.X11-unix -v ${HOME}:/home/dev/host_home --name dev -u dev crz33/terminal /bin/bash

Dockerまとめ記事へのリンク

Dockerの他のネタを纏めています。参考になれば嬉しいです。

↓↓↓Dockerまとめページはこちら↓↓↓
【保存版】Dockerまとめ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする