【问题标题】:Docker run --entrypoint with multiple parameters带有多个参数的 Docker 运行 --entrypoint
【发布时间】:2021-05-15 21:11:49
【问题描述】:

我试图了解 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 ["executable", "param1", "param2"] 的技术限制? Docker Compose 似乎支持它

# 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 兼容?

【问题讨论】:

  • (这是一个很好的理由,我更喜欢CMD 而不是ENTRYPOINT 用于日常使用,恕我直言。)

标签: docker docker-compose entry-point


【解决方案1】:

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

This 是提取入口点的位置:

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

spf13/pflag 库中的StringVar 将仅提取标志之后的第一个字符串,因为它解析命令行参数的方式。因此,如果它们用空格分隔或没有用双引号 " 括起来,则不会得到标志后面的所有字符串。所以这似乎是技术上的限制。

【讨论】:

  • 啊,我明白了,谢谢。听起来这种技术限制仅限于 docker CLI,并且不会影响其他替代方案(例如 Docker 引擎 API)。
  • @mxxk 是的,完全正确。 CLI 只是填充相同的结构,设置配置的底层类型是一个字符串切片,但 CLI 总是向它传递一个字符串:github.com/moby/moby/blob/v1.13.1/api/types/container/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
相关资源
最近更新 更多