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

Dou*_*dou 9 bash shell entry-point docker dockerfile

在尝试使用Dockerspec测试Dockerfiles后,我终于遇到了一个无法正确解决的问题.

我认为问题来自Docker本身; 如果我理解它的进程,一个Entrypoint只在运行时执行,但如果容器保持启动并且我启动了一个"exec"命令,则不会重新调用它.

我认为这是通缉行为.

但是,如果入口点是" 古薮 "脚本,我之前所有的命令,这是个问题......


"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.

因此,最好的解决方案是找到如何获取docker runServerspec执行的stdout.

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

Der*_*ley 5

如果您的目标是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 "$@"
Run Code Online (Sandbox Code Playgroud)

赋予它执行权限,chmod +x gs然后./gs从本地文件夹运行

  • 那么,您要的是不可能的。根据定义,ENTRYPOINT仅在容器启动时运行 (2认同)