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

时间:2017-05-01 17:49:12

标签: bash shell docker dockerfile entry-point

在尝试使用Dockerspec测试Dockerfiles之后,我终于遇到an issue我无法正确解析。

我认为问题来自Docker本身;如果我理解它的过程,一个入口点只在运行时执行,但是如果容器保持启动并且我启动了一个“exec”命令,则不会重新调用它。

我认为这是通缉行为。

但是如果Entrypoint是一个“gosu”脚本,它位于我的所有命令之前,那就是一个问题......

示例

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

如果我发布:docker run -it myImage id -u

输出为“1000”。

如果我开始一个容器:docker run -it myImage bash

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

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

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

有没有办法每次执行入口点? 或者重新使用shell打开?

或者更好的方法呢?

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

谢谢!

修改

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

因此,最好的解决方案是找到如何获取Serverspec执行的docker run的标准输出。

但是,在我的个人用例中,最好的解决方案可能是不使用Gosu而是--user flag:)

1 个答案:

答案 0 :(得分:4)

如果您的目标是在容器内部使用特定用户运行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运行