持久化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"
  }
```

视频:如何在开发容器中持久化你的bash历史记录