【问题标题】:Docker and .bash_historyDocker 和 .bash_history
【发布时间】:2015-04-01 12:35:04
【问题描述】:

有没有办法与 docker 容器共享 .bash_history 卷,这样每次我进入 shell 时,我的 bash 历史记录都可以滚动浏览?

如果能用 IPython 做同样的事情,那就太棒了。

【问题讨论】:

    标签: bash docker ipython dockerfile


    【解决方案1】:

    这是来自documentation about volume: Mount a host file as a data volume的例子:

    docker run --rm -it -v ~/.bash_history:/root/.bash_history ubuntu /bin/bash
    

    这会将您放入新容器中的 bash shell,您将获得来自主机的 bash 历史记录,当您退出容器时,主机将获得键入命令的历史记录,而在容器中。

    【讨论】:

    • 我应该对此添加评论 - 我看到并尝试过,但没有成功。我在容器内运行的命令似乎没有更新.bash_history 文件。我以 root 用户身份运行容器内的命令。有什么想法吗?
    • 文档中确实有错字。 .bash_history 应该在用户的主目录中,而不是 fs 的根目录中。应该是docker run --rm -it -v ~/.bash_history:/root/.bash_history ubuntu /bin/bash,因为我们默认是 docker 容器的 root。
    • 大部分无关紧要,但我不想分享 bash 历史记录,只需要将主机终端历史记录带到容器中,因此从这里获取线索并进一步扩展它,我使用了单独的 .docker_bash_history并以与您提到的相同的方式安装它。
    • @cryanbhu 您可以复制 .bash_history 文件并将其传递给容器 docker run --rm -it -v ~/.bash_history:/root/.docker_bash_history ubuntu /bin/bash。如果是重复的,可以自动复制历史文件(注意不要覆盖容器更新的历史)。
    • 小伙伴们要小心!我将我的 4000 多行长历史文件安装到一个容器中,它立即被裁剪为 500 行,因为 HISTSIZE 正是那个数字,无法恢复它,我只是丢失了大约 90% 的 bash 历史:D
    【解决方案2】:

    在你的docker-compose.override.yml:

    version: '2'
    services:
      whatever:
        …
        volumes:
          - …
          - ~/.bash_history:/root/.bash_history
    

    【讨论】:

    • 文档指出挂载的卷必须以“/”开头。 '~' 对我不起作用。
    • @aghull 您可以将~ 替换为$HOME 的值,但它的可移植性会降低
    【解决方案3】:

    要保留 IPython 历史记录,您可以将 IPYTHONDIR 环境变量设置为映射卷内的某个位置。

    docker-compose.override.yml 看起来像这样:

    version: '2'
    services:
      some-service:
        environment:
          - IPYTHONDIR=/app/.ipython
        volumes:
          - .:/app
    

    【讨论】:

      【解决方案4】:

      我的解决方案在以下情况下很有用:

      • 您不想与容器中的 .bash_history 共享本地 .bash_history
      • 您使用其他 shell(如鱼壳),但您想在构建之间保存 .bash_history
      • 您不想将 .bash_history 提交到 git repo,但您想在容器启动时在同一目录中自动创建它

      我假设文件结构是:

      docker-compose.yml
      docker/
         \--> bash/
            \--> .bashrc
            \--> .bash_history
      

      docker-compose.yml

      web-service:
        build: .
        volumes:
        - ./docker/bash/.bashrc:/home/YOUR_USER_NAME/.bashrc
        - ./docker/bash:/home/YOUR_USER_NAME/bash
      

      ./docker/bash/.bashrc - 它会自动创建 .bash_history:

      export HISTFILE=~/bash/.bash_history
      touch $HISTFILE
      

      您可以选择添加到 .gitignore

      docker/bash/.bash_history
      

      【讨论】:

        【解决方案5】:

        您也可以使用命名卷来实现此目的,并通过定义HISTFILE 环境变量告诉 bash 在哪里可以找到 bash 历史文件。我在这里解释了更多: https://antistatique.net/en/we/blog/2019/11/12/tips-docker-keep-your-bash-history

        【讨论】:

        • 只是对那些不在 docker 容器中使用 root 用户的人的观察。您需要修改 Dockerfile 以创建 bash_history 文件所在的文件夹,并将该文件夹的所有权更改为您在容器中使用的用户。
        【解决方案6】:

        对于 bash

        volumes:
                - ./.data/shell_history/php_bash_history.txt:/home/www-data/.bash_history #bash
        

        为 sh

        volumes:
            - ./.data/shell_history/nginx_bash_history.txt:/root/.ash_history #sh
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-20
          • 1970-01-01
          • 2012-05-16
          • 1970-01-01
          • 2021-02-10
          • 2011-11-03
          • 1970-01-01
          • 2014-12-16
          相关资源
          最近更新 更多