我有入口shell脚本,接受参数 -a -b 。
我正在使用 docker-compose.yml 文件,我用指令覆盖tomcat的入口点:
entrypoint: /usr/local/tomcat/entrypoint.sh -a param1 -b param2
什么是 docker run 替代?
docker run --entrypoint "/usr/local/tomcat/entrypoint.sh -a param1 -b param2" tomcat:jre8
不起作用
我明白了:
docker: Error response from daemon:
invalid header field value "oci runtime error: container_linux.go:247:
starting container process caused \"exec:
\\\"/usr/local/tomcat/entrypoint.sh -a param1 -b param2\\\":
stat /usr/local/tomcat/entrypoint.sh -a param1 -b param2:
no such file or directory\"\n".
供参考:
docker run --entrypoint "/usr/local/tomcat/entrypoint.sh" tomcat:jre8
从Docker的角度来看,但显然脚本失败了
答案 0 :(得分:24)
这是因为您在命令周围使用了引号。
当您运行docker run --entrypoint "/usr/local/tomcat/entrypoint.sh -a param1 -b param2" tomcat:jre8
时,Docker会将这些引号中的内容视为单个脚本文件。
从错误中可以看出:
stat /usr/local/tomcat/entrypoint.sh -a param1 -b param2:
no such file or directory\"\n".
尝试在运行之前对文件执行stat
,因此它知道它是否存在。
将参数放在docker命令末尾的入口点,如下所示:
docker run --entrypoint <entrypoint.sh> <image:tag> <arg1> <arg2> <arg3>
您的命令变为:
docker run --entrypoint /usr/local/tomcat/entrypoint.sh tomcat:jre8 -a param1 -b param2
查看官方文档中的代码段:
图像的ENTRYPOINT类似于COMMAND,因为它 在容器启动时指定要运行的可执行文件
https://docs.docker.com/engine/reference/run/#/entrypoint-default-command-to-execute-at-runtime
答案 1 :(得分:5)
我认为这也值得注意:
docker run
命令有很多参数,那么你的--entrypoint
应该是第一个。我不知道哪些论点是问题所在,但最后放--entrypoint "/bin/bash"
并不会阻止从Dockerfile执行ENTRYPOINT。我的论点包括:
答案 2 :(得分:1)
N.B:回答这个旧问题是因为建议的答案使我不满意,因为它们是部分错误的。
简短答案: 没有办法使用倍数参数覆盖入口点,但是您可以将它们移至将起作用的命令(在图像名称之后的部分)
更详细的答案:
经过一些测试并阅读了文档,很明显,没有办法通过docker run模拟dockerfile或docker-compose入口点行为。
建议的答案是将入口点覆盖为单个二进制文件(即不使用args),并将原始参数放入COMMAND。
通常可以完成这项工作,但实际上可以使用docker inspect
来揭示概念上的差异。
在docker中,ENTRYPOINT是二进制文件+默认args,它将在启动时启动,并且用户在正常使用时不应更改它们。 COMMAND是您要用户更改的其余参数(例如ping的目标主机名)。因此它们在概念上是不同的。
说在很多情况下,将args从入口点移到命令一次容器并不重要,结果命令看起来是一样的。
答案 3 :(得分:0)
我不确定你是否可以根据官方码头文件来做到这一点:
注意:您可以使用--entrypoint覆盖ENTRYPOINT设置,但是 这只能将二进制文件设置为exec(不会使用sh -c)。
https://docs.docker.com/engine/reference/builder/#/environment-replacement