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