默认Docker入口点

时间:2016-06-04 20:00:15

标签: docker sh

我正在从另一个设置特定入口点的图像创建图像。但是我希望我的图像具有默认图像。如何重置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

如何在不引用的情况下使用命令?

3 个答案:

答案 0 :(得分:27)

要禁用现有ENTRYPOINT,请在泊坞窗文件中设置一个空数组

ENTRYPOINT []

然后你对docker run的论证将正常执行。

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

未引用的结果会将大量参数发送到sh

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

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

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

答案 1 :(得分:0)

这与docker无关。尝试运行以下内容:

/bin/sh -c echo foo

/bin/sh -c "echo foo"

-c意味着/bin/sh仅选择一个参数。因此,从您定义的入口点删除-c应该可以解决。这比重置入口点更灵活。例如您可以执行以下操作以使用软件集合:

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

答案 2 :(得分:0)

注意:当心ENTRYPOINT []

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

在不使用BuildKit的情况下,类似ENTRYPOINT []ENTRYPOINT [""]的外观都会使每个构建中的缓存失效。

简单的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!"