我正在从另一个设置特定入口点的图像创建图像。但是我希望我的图像具有默认图像。如何重置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
如何在不引用的情况下使用命令?
答案 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!"