如何在每个“exec”命令中执行Docker镜像的入口点?

在试图用DockerspectestingDockerfiles之后,我终于遇到了一个我无法正确解决的问题 。

我想,问题在于Docker本身。 如果我理解它的过程, 一个入口点只在运行时执行 ,但是如果容器保持启动状态,我启动一个“exec”命令,它不会被重新调用。

我认为这是想要的行为。

但是,如果入口点是所有命令之前的“gosu”脚本,这是一个问题…


“myImage”有这个入口点:gosu gosu 1000:1000 "$@"

如果我启动: docker run -it myImage id -u

输出是“1000”。

如果我启动一个容器: docker run -it myImage bash

在这个容器中, id -u输出“1000”。

但是如果我在这个容器中启动一个新的命令,它会启动一个新的shell,并且不会执行入口点,所以:docker docker exec CONTAINER_ID id -u

输出“0”,因为新的shell以“root”身份启动。


有没有一种方法来执行每个入口点? 或者重新使用shell打开?

或者更好的方法来做到这一点?

或者,也许我什么都不懂? ;)

谢谢 !


编辑

在阅读了这里提出的解决scheme之后,我明白问题不在于Docker的工作方式,而在于Serverspec如何工作。 我的目标是直接testing一个命令作为docker docker run参数,但是Serverspec使用docker exec启动一个容器和testing命令。

所以,最好的解决办法是find如何获得由Serverspec执行的docker run的标准输出。

但是,在我个人的使用情况下,最好的解决办法可能是不使用Gosu,但 – 用户标志:)

如果您的目标是使用容器内的特定用户运行docker exec ,则可以使用--user选项。

docker exec --user myuser container-name [... your command here]

如果你想每次都运行gosu ,你可以使用docker exec来指定这个命令

docke exec container-name gosu 1000:1000 [your actual command here]

根据我的经验,将其封装成可轻松重新使用的最好方法是使用.sh脚本(或Windows中的.cmd文件)。

把它放到你本地文件夹里的一个文件中,例如gs

 #! /bin/sh docker exec container-name gosu 1000:1000 "$@" 

chmod +x gs给它执行权限,然后用本地文件夹中的./gs运行