如何在 Dockerfile 中设置命令历史记录

5
我正在本地运行docker容器来排除故障。 我并不总是想执行RUN/ENTRYPOINT,我经常想进入正在运行的容器中,做一些事情,然后再执行RUN/ENTRYPOINT。如果我能通过按上箭头键来在docker run bash之后直接使用RUN/ENTRYPOINT,那就太方便了。因此,我认为如果我能用history -s ...修改历史记录,并将其放入Dockerfile中会很好。这样,只要我运行了docker run bash,我就可以直接按上箭头键,使用RUN/ENTRYPOINT。但是当我将此内容放入Dockerfile中时,出现了以下错误:
 /bin/sh: 1: history: not found

有没有一种方法可以在 Dockerfile 中设置 bash 历史记录?
1个回答

5

你遇到这个错误是因为RUN命令在/bin/sh中运行,而history命令在该环境下不可用。

要解决此问题,需要在构建期间运行一个交互式的bash shell,这样它就会存储您的历史记录条目。

RUN bash -ic 'history -s foobar'

执行完这个命令后,应该会留下一个历史记录文件,并且foobar是其最新(可能也是唯一)的条目。

在构建过程中会出现关于ioctl的错误...这是正常的,因为交互式bash期望找到终端,但这里没有。但它应该仍然能够正常工作。

bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell

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


谢谢你的回答,我尝试了这个方法,但是当我按上箭头时,历史记录并没有出现。执行 history 命令后,输出为空白。 - Daniel Kaplan
@DanielKaplan 你使用了哪个Dockerfile?我用FROM ubuntu:latest构建了一个简单的Dockerfile,只有一个RUN命令。以docker run -it myimage bash方式运行它,测试中可以正常使用history。 - Dan Lowe
我的问题是我写了RUN bash -ic 'history -s foobar &',我需要像这样转义 &:RUN bash -ic 'history -s foobar &',然后它就可以正常工作了。谢谢! - Daniel Kaplan
@DanielKaplan 哦,好的。 似乎是不必要的,但我很高兴你解决了它。 - Dan Lowe
@DanielKaplan 哦!我明白了,我以为你试图将“history”命令放到后台运行,误解了。 - Dan Lowe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接