具有多个参数的Docker run --entrypoint

11

我试图理解Dockerfile中的ENTRYPOINTdocker run --entrypoint之间的差异。 ENTRYPOINTexec形式允许多个参数,

# Source: https://docs.docker.com/engine/reference/builder/#entrypoint
ENTRYPOINT ["executable", "param1", "param2"]

但是 docker run --entrypoint=executable 只接受一个。很多示例展示了如何用参数重写 ENTRYPOINT,但他们也指定了 CMD

docker run --entrypoint=executable image:latest param1 param2

是否存在技术限制阻止直接使用 docker run --entrypoint 等效于 ENTRYPOINT ["可执行文件", "参数1", "参数2"]?Docker Compose 似乎支持它。

Translated text:

Is there a technical limitation that prevents a direct docker run --entrypoint equivalent to ENTRYPOINT ["executable", "param1", "param2"]? Docker Compose seems to support it.

# Source: https://docs.docker.com/compose/compose-file/compose-file-v3/#entrypoint
entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"]

其他与Docker合作的提供商也是如此(例如AWS ECS)。或者,内部可能会将[...entrypoint_args, ...command_args]实际上调整为[entrypoint,...command]以使其与docker run兼容?


2
这是一个很好的理由,我个人认为在日常使用中更喜欢使用CMD而不是ENTRYPOINT - David Maze
1个回答

8

Docker cli使用Golang CLI管理器spf13/cobra来处理其标志,例如--entrypoint

此处是提取entrypoint的位置:

flags.StringVar(&copts.entrypoint, "entrypoint", "", "Overwrite the default ENTRYPOINT of the image")

来自spf13/pflag库的StringVar只会提取标志后的第一个字符串,这是由于它解析命令行参数的方式所决定的。因此,如果它们由空格分隔或未用双引号"括起来,它将无法获取标志后的所有字符串。这似乎是该技术的局限性。

啊,我明白了,谢谢。听起来这个技术限制只限于 docker 命令行界面,不会影响其他替代方案(例如 Docker 引擎 API)。 - mxxk
1
@mxxk 是的,完全正确。CLI只是填充相同的结构体,设置配置的基础类型是字符串切片,但CLI始终将其传递为字符串:https://github.com/moby/moby/blob/v1.13.1/api/types/container/config.go#L54 - cam

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