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

我有接受参数-a -b的入口shell脚本。

我有工作docker-compose.yml文件,我用指令覆盖tomcat的入口点:

entrypoint: /usr/local/tomcat/entrypoint.sh -a param1 -b param2 

什么是docker运行替代?

 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的angular度来看,但显然脚本失败

这是因为你的命令使用了引号。

当你运行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

我觉得这个也值得注意:

如果你有一堆参数给你的--entrypoint docker run命令,你的--entrypoint应该是第一位的。

我不知道我的哪个参数是问题,但是在--entrypoint "/bin/bash"并不能阻止Dockerfile的ENTRYPOINT执行。 我的论据包括:

  • 1x –rm
  • 1x – 名称
  • 1x -it
  • 3x -v
  • 6x -p
  • 4倍-e

根据官方的docker文档,我不确定你能做到这一点:

注意:你可以使用–entrypoint覆盖ENTRYPOINT设置,但是这只能将二进制设置为exec(不会使用sh -c)。

https://docs.docker.com/engine/reference/builder/#/environment-replacement