はじめに
docker exec するとターミナルサイズが適切に設定されないようです。
取り急ぎ、理由は調べていませんが、ワークアラウンドを用意したのでメモします。
ちなみに
端末サイズの変更には追従してくれます。最初だけ、です。
現象の確認
先んじて現象の確認方法を示します。もし現象が再現しないようならワークアラウンドは不要ということです。
docker run は問題ない
$ stty size
24 80
$ docker run --rm -t -i hogehoge bash -l
[inner-prompt]$ stty size
24 80
docker exec だとダメ
$ stty size
24 80
$ docker exec -t -i foobar bash -l
[inner-prompt]$ stty size
0 0
ワークアラウンド
今のターミナルサイズを stty を使って能動的にセットします。
ただ手打ちはダルさんなので(半)自動化します。
自動設定コマンドライン生成スクリプトを用意
setuptty.sh
#!/bin/sh
val=$(stty size)
rows=$(echo $val | cut -d ' ' -f 1)
cols=$(echo $val | cut -d ' ' -f 2)
echo "stty rows $rows cols $cols"
docker exec を工夫する
$ stty size
24 80
$ docker exec -t -i foobar sh -c "$(setuptty.sh); exec bash -l"
[inner-prompt]$ stty size
24 80
$ stty size
24 80
$ docker-compose exec zervize sh -c "$(setuptty.sh); exec bash -l"
[inner-prompt]$ stty size
24 80
私は貧乏性なので exec hoge
してプロセス数を減らします。
"; exec" までスクリプトで echo しても良いのですけれど、構文が汚くなるので我慢します。exec したくないケースもあるかも知れませんし。
おわりに
個人的にはコンテナに ssh するのが好きなので(他の仮想化と対照的で良い)、あんまり exec bash しないです。
docker-ce for Ubuntu 18.04 早く出ないかなー。