【问题标题】:How to set the command history in a Dockerfile如何在 Dockerfile 中设置命令历史记录
【发布时间】:2017-06-19 21:42:23
【问题描述】:

我正在本地运行 docker 容器以对其状态进行故障排除。我并不总是想执行RUN/ENTRYPOINT,我经常想进入正在运行的容器,做一些事情,然后运行RUN/ENTRYPOINT

在我docker run bash 之后,只需按向上键就可以使用RUN/ENTRYPOINT,这将非常方便。所以我认为如果我可以在Dockerfile 中使用history -s ... 修改历史记录会很好。这样一来,只要我docker run bash,我就可以按下并让RUN/ENTRYPOINT 可用。

当我把它放在 docker 文件中时,我得到了这个错误:

 /bin/sh: 1: history: not found

有没有办法在 Dockerfile 中设置 bash 历史记录?

【问题讨论】:

    标签: bash docker sh


    【解决方案1】:

    您收到错误是因为RUN 命令在/bin/sh 中运行,而history 没有可用的命令。

    要完成这项工作,您需要在构建过程中运行一个交互式 bash shell,这样它就会存储您的历史条目。

    RUN bash -ic 'history -s foobar'
    

    这应该留下一个历史文件,其中foobar 作为其最近的(可能是唯一的)条目。

    在构建过程中你会看到一个关于 ioctl 的错误...这是正常的,因为交互式 bash 期望找到一个终端,但不会有。但它应该仍然可以正常工作。

    bash:无法设置终端进程组(1):设备的 ioctl 不合适
    bash:在这个 shell 中没有作业控制

    请注意,这将为您运行命令的用户存储。如果您的图像使用USER 语句切换到非root 用户,则应将其放在USER 行之后,以便将其存储在您的图像运行的用户中。

    【讨论】:

    • 感谢您的回答,我试过这个,当我按下时,历史记录不存在。这是history 的输出为空白。
    • @DanielKaplan 你在用什么 dockerfile?我用FROM ubuntu:latest 和那个 RUN 命令构建了一个简单的 dockerfile。以docker run -it myimage bash 运行它,历史在我的测试中起作用。
    • 我的问题是我有 RUN bash -ic 'history -s foobar &', I need to escape the & like this: RUN bash -ic 'history -s foobar \&' 并且它有效。谢谢
    • @DanielKaplan 好的。 & 似乎没有必要,但我很高兴你解决了它。
    • @DanielKaplan 哦!我明白了,我以为你是在尝试将 history 命令设置为背景,误解了。
    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2016-05-07
    • 2011-09-22
    相关资源
    最近更新 更多