Bash
screen
tty
docker

docker execでコンテナ内に入ると端末の挙動がいまいちな件

More than 1 year has passed since last update.

まずはdockerコンテナ内に入る

お馴染みの方法でごく単純に

docker exec -it $container_name bash --login

または

docker exec -it $container_name bash -l

入れるのは入れるけど

  • dumb端末(画面なし扱い)になってしまうため、描画周りに難あり
  • ttyがないのでscreenも使えない(起動できない)

対策

コンテナの/root/.bash_profileに以下を追記する

/root/.bash_profile
if [ x$TERM = xdumb ]; then
    export TERM=xterm-256color
    exec >/dev/tty 2>/dev/tty </dev/tty
    cd $HOME
fi
  • TERMを上書きしてxterm-256color(ただのxtermでも可、お好みで)にすると描画周りが改善される
  • ttyを無理やり繋いでいるのでscreenを使えるようになる

/root/.bash_profileを書き換えるためだけにイメージをビルドし直したりしたくない

  • dockerホスト側の適当なパスに上記の追記をした.bash_profileを置いておく

    • 仮に /home/your_name/container_bash_profile とする
  • docker-compose.ymlに以下を追記する

    • read onlyでコンテナの/root/.bash_profileにdockerホスト側のファイルを重ねてしまう
    • docker-compose使ってない場合はdocker run -vで頑張ってください
docker-compose.yml
    volumes:
      - /home/your_name/container_bash_profile:/root/.bash_profile:ro
  • コンテナを立ち上げ直す
docker-compose up -d

既知の問題

  • tty無理やり繋いでscreenを使えるようにはなっているけど、detachしたセッションにattachできない
    • うっかりdetachするとそのセッションにはどうやっても復帰できないので注意
    • 解決策を知っている方は教えてください