LoginSignup
0
1

Dockerコンテナ内のコマンド履歴を永続化してfzfで検索する

Last updated at Posted at 2023-09-06

docker-composeコマンドはEOLになったCompose V1のコマンドで、非推奨となっています。当記事は現在の開発環境がCompose V2に移行できてないためCompose V1での記載になっています。ご注意ください。詳しくは下記の記事をご確認ください。

概要

Dockerコンテナ内のコマンド履歴永続化

開発でdocker-compose exec containername bashでコンテナ内でコマンドを打つことが多くあり、docker-compose downでコンテナを削除するとコマンド履歴が消えてしまい、「前回打ったあのコマンドなんだっけ?」と再度調べることが多かったので、コマンド履歴が消えないようにしたかった。

fzf導入

CLIで標準入力されたテキストを受け取り、キー入力されたテキストでインクリメンタルにあいまい検索できる便利ツール。
パイプでつないでいろいろな使い方ができるが今回はhistoryコマンドで出力されるコマンド履歴をfzfで絞り込めるようにします。

fzf.gif

環境

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月号「最強の開発環境探求の道」から引用させて頂きました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1