Docker使用shell脚本运行覆盖入口点,该脚本接受参数

时间:2017-01-17 10:11:46

标签: docker docker-compose

我有入口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的角度来看,但显然脚本失败了

4 个答案:

答案 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。我的论点包括:

  • 1x --rm
  • 1x --name
  • 1x -it
  • 3x -v
  • 6x -p
  • 4x -e

答案 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