【问题标题】:Default Docker entrypoint默认 Docker 入口点
【发布时间】:2016-10-04 16:57:51
【问题描述】:

我正在从另一个设置了特定入口点的图像创建图像。但是我希望我的图像具有默认值。如何重置 ENTRYPOINT?

我尝试了以下 Dockerfile:

FROM some-image
ENTRYPOINT ["/bin/sh", "-c"]

不幸的是,它不像默认入口点那样工作,因为它需要引用命令。

docker run myimage ls -l /    # "-l /" arguments are ignored
file1 file2 file3             # files in current working directory

docker run myimage "ls -l /"  # works correctly

如何使用不带引号的命令?

【问题讨论】:

  • 查看重置入口点的帮助$ docker run --help | grep entrypoint显示--entrypoint Overwrite the default ENTRYPOINT of the image
  • 我需要在 Dockerfile 中这样做

标签: docker sh


【解决方案1】:

要禁用现有的 ENTRYPOINT,请在 docker 文件中设置一个空数组

ENTRYPOINT []

那么您对docker run 的参数将像shell form CMD 通常那样执行。

ENTRYPOINT ["/bin/sh", "-c"] 需要带引号的字符串的原因是,如果没有引号,ls 的参数将被传递给 sh

未加引号导致大量参数被发送到sh

"/bin/sh", "-c", "ls", "-l", "/"

引用允许将完整的命令 (sh -c) 作为一个参数传递给 sh

"/bin/sh", "-c", "ls -l /"

【讨论】:

  • 你确定不是因为-c 导致sh 只选择一个参数吗?我使用的是bash,而不是sh,并且从ENTRYPOINT 中删除-c 可以让它接收以后的参数。
  • @Mohan 我不确定你的意思? -c 参数是 shbash 将运行的,按照设计,这是一个参数。引号使其成为单个参数,否则之后的任何内容都将被忽略
  • 您帮助 OP 解决了他的问题,但没有真正解释为什么 ENTRYPOINT ["/bin/sh", "-c"]ENTRYPOINT [] 不同,而它们都应该与 /bin/sh -c 相同是默认值。
  • @DevAb 图像默认是没有入口点,这就是[] 等价的。这与/bin/sh -c 的入口点不同,后者在 OP 构建的图像中设置在某处(以及为什么我使用术语“禁用”)
  • @DevAb 这是CMD 的默认启动方式,与指定的ENTRYPOINT 略有不同。如果您使用CMD words 的shell 形式,words 将被传递给/bin/sh -c "words"。执行形式CMD [ "exec" ] 不会使用sh
【解决方案2】:

这实际上与 docker 无关。尝试运行以下命令:

/bin/sh -c echo foo

/bin/sh -c "echo foo"

-c 表示/bin/sh 只选择一个参数。因此,从您定义的入口点中删除 -c 应该可以修复它。这比重置入口点更灵活;例如您可以这样做以使用软件集合:

ENTRYPOINT ["scl", "enable", "devtoolset-4", "--", "bash"]

【讨论】:

    【解决方案3】:

    注意:小心ENTRYPOINT []

    moby/moby issue 3465(“重置从父图像继承的属性”)中所述,Brendon C. 注释:

    看起来ENTRYPOINT []ENTRYPOINT [""] 在不使用 BuildKit 时都会使每个构建的缓存失效。

    简单的 Dockerfile 来演示:

    FROM jrottenberg/ffmpeg:4.3-alpine311 as base
    
    ENTRYPOINT []
    
    RUN echo "HERE!"
    

    第 2 步和第 3 步永远不会使用缓存。这是我的解决方法:

    FROM jrottenberg/ffmpeg:4.3-alpine311 as base
    
    ENTRYPOINT ["/usr/bin/env"]
    
    RUN echo "HERE!"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 2023-02-16
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      相关资源
      最近更新 更多