🚀 VS Codeでで入手!

Bashの履歴を永続化する

マウントを使用して、セッションやコンテナーの再構築を超えてbashコマンド履歴を永続化することもできます。

まず、Dockerfileを更新して、bashでコマンドが使用されるたびに、履歴が更新され、永続化する場所に保存されるようにします。

rootユーザーの場合は、Dockerfileを以下のように更新してください。

RUN SNIPPET="export PROMPT_COMMAND='history -a' && export HISTFILE=/commandhistory/.bash_history" \
    && echo "$SNIPPET" >> "/root/.bashrc"

root以外のユーザーの場合は、Dockerfileを以下のように更新してください。user-name-goes-hereをコンテナー内のroot以外のユーザーの名前に置き換えてください。

ARG USERNAME=user-name-goes-here

RUN SNIPPET="export PROMPT_COMMAND='history -a' && export HISTFILE=/commandhistory/.bash_history" \
    && mkdir /commandhistory \
    && touch /commandhistory/.bash_history \
    && chown -R $USERNAME /commandhistory \
    && echo "$SNIPPET" >> "/home/$USERNAME/.bashrc"

次に、コマンド履歴を保存するためのローカルボリュームを追加します。この手順は、Docker Composeを使用しているかどうかによって異なります。

  • Dockerfileまたはイメージ: devcontainer.jsonファイルでmountsプロパティ(VS Code 1.41以降)を使用します。

      "mounts": [
          "source=projectname-bashhistory,target=/commandhistory,type=volume"
      ]
    
  • Docker Compose: 適切なサービスについて、docker-compose.ymlを以下のように更新(または拡張)します。

    version: '3'
    services:
      your-service-name-here:
        volumes:
          - projectname-bashhistory:/commandhistory
         # ...
    volumes:
      projectname-bashhistory:
    

最後に、コンテナーをすでにビルドして接続している場合は、コマンドパレット(F1)からDev Containers: Rebuild Containerを実行して変更を反映します。それ以外の場合は、Dev Containers: Open Folder in Container...を実行してコンテナーに接続します。

注: ホストマシンがLinux(Windows上のWSLを含む)を実行しており、そのユーザーのUIDとGIDが開発コンテナー内のユーザーのUIDとGIDと一致しない場合、開発コンテナーユーザーのUIDとGIDはホストユーザーのものに更新され、devcontainer.jsonに以下を追加してボリュームに同じ更新を適用する必要があります。

```json
  "postCreateCommand": {
    "Fix Volume Permissions": "sudo chown -R $(whoami): /commandhistory"
  }
```

ビデオ: Dev Containerでbashの履歴を永続化する方法