docker-compose
コマンドはEOLになったCompose V1のコマンドで、非推奨となっています。当記事は現在の開発環境がCompose V2に移行できてないためCompose V1での記載になっています。ご注意ください。詳しくは下記の記事をご確認ください。
概要
Dockerコンテナ内のコマンド履歴永続化
開発でdocker-compose exec containername bash
でコンテナ内でコマンドを打つことが多くあり、docker-compose down
でコンテナを削除するとコマンド履歴が消えてしまい、「前回打ったあのコマンドなんだっけ?」と再度調べることが多かったので、コマンド履歴が消えないようにしたかった。
fzf導入
CLIで標準入力されたテキストを受け取り、キー入力されたテキストでインクリメンタルにあいまい検索できる便利ツール。
パイプでつないでいろいろな使い方ができるが今回はhistory
コマンドで出力されるコマンド履歴をfzfで絞り込めるようにします。
環境
Docker version 20.10.14
Bash
PHP8.1
apache
ディレクトリ構成
├── mysql
├── php
│ └── Dockerfile
└── phpmyadmin
└── docker-compose.yml
コマンド履歴を永続化するためvolumesを設定
docker-compose.yml
phpコンテナの部分に以下追記。
services:
php:
volumes:
# bashコマンド履歴を保存するための設定
- bashhistory:/commandhistory
services: の下に以下のvolumesを定義。
# bashコマンド履歴を保存するための設定
volumes:
bashhistory:
name: bashhistory_product1 # コンテナごとにユニークになるような名前にする
Dockerfileでfzfインストール、コマンド履歴を保存する設定を記述
Dockerfile
FROM php:8.1-apache
# fzf インストール
RUN apt-get update && apt-get install -y \
fzf
ARG USER_NAME=hoge
ARG USER_ID=1000
ARG GROUP_ID=1000
# ローカルユーザーをベースに新しくユーザー作成する
RUN groupadd -o -g ${GROUP_ID} ${USER_NAME} \
&& useradd -om -u ${USER_ID} -g ${GROUP_ID} ${USER_NAME} \
&& chown ${USER_NAME}:${USER_NAME} /var/www/html
# bashコマンド履歴を保存するための設定
RUN SNIPPET="export PROMPT_COMMAND='history -a' && export HISTFILE=/commandhistory/.bash_history" \
&& mkdir /commandhistory \
&& touch /commandhistory/.bash_history \
&& chown -R ${USER_NAME} /commandhistory \
&& echo "$SNIPPET" >> "/home/${USER_NAME}/.bashrc"
RUN SNIPPET="select-history() {\n\
# コマンドの実行履歴をfzfで選択し、コマンドラインへ書き込む\n\
READLINE_LINE=\"\$(HISTTIMEFORMAT='' history | awk '{ \$1 = \"\";print}' | fzf --query \"\$READLINE_LINE\")\"\n\
# カーソルをコマンドラインの右端に移動\n\
READLINE_POINT=\$#READLINE_LINE\n\
}\n\
# シェル関数にキーボードショートカット Ctrl-R を割り当てる\n\
bind -x '\"\\C-r\": select-history'" \
&& echo "$SNIPPET" >> "/home/${USER_NAME}/.bashrc"
WORKDIR /var/www/html
# 作成したユーザーに切り替える
USER ${USER_NAME}
docker-compose build --no-cache
docker-compose up -d
docker-compose exec php bash
再ビルドしてコンテナ上げて、コンテナ内に入り、ctrl + R
を押すとfzfでのhistory絞り込みができるようになっている。
docker-compose down
してコンテナを削除してもコマンド履歴が消えないようになっている。
ちなみにローカルの.bashrcに上記のselect-history()
を追記してfzfインストールすればもちろん同じようにローカルでも使えます。
参考にさせていただいた記事など
.bashrc 記述するselect-history()
はSoftware Dwesign2023年02月号「最強の開発環境探求の道」から引用させて頂きました。