Bash履歴の永続化

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

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

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"
  }
```

動画: 開発コンテナでbashの履歴を永続化する方法

© . This website operates independently and is not affiliated with or endorsed by Microsoft. All brand names, logos, and trademarks are the property of their respective owners.