在尝试使用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:)
答案 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
运行