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

Pat*_*čin 28 docker docker-compose

我有入口shell脚本,它接受参数-a -b.

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

entrypoint: /usr/local/tomcat/entrypoint.sh -a param1 -b param2
Run Code Online (Sandbox Code Playgroud)

什么是docker run替代品?

docker run --entrypoint "/usr/local/tomcat/entrypoint.sh -a param1 -b param2" tomcat:jre8
Run Code Online (Sandbox Code Playgroud)

不起作用

我明白了:

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".
Run Code Online (Sandbox Code Playgroud)

供参考:

docker run --entrypoint "/usr/local/tomcat/entrypoint.sh" tomcat:jre8
Run Code Online (Sandbox Code Playgroud)

从Docker的角度来看,但显然脚本失败了

Adr*_*rea 44

这是因为您在命令周围使用了引号.

当您运行docker run --entrypoint "/usr/local/tomcat/entrypoint.sh -a param1 -b param2" tomcat:jre8Docker时,将这些引号中的任何内容视为单个脚本文件.

从错误中可以看出:

stat /usr/local/tomcat/entrypoint.sh -a param1 -b param2: 
no such file or directory\"\n".
Run Code Online (Sandbox Code Playgroud)

它正在尝试stat在运行之前对文件执行,因此它知道它是否存在.

将参数放在docker命令末尾的入口点,如下所示:

docker run --entrypoint <entrypoint.sh> <image:tag> <arg1> <arg2> <arg3>
Run Code Online (Sandbox Code Playgroud)

你的命令变为:

docker run --entrypoint /usr/local/tomcat/entrypoint.sh tomcat:jre8 -a param1 -b param2 
Run Code Online (Sandbox Code Playgroud)

看一下官方文档中的代码片段:

图像的ENTRYPOINT类似于COMMAND,因为它指定容器启动时要运行的可执行文件

https://docs.docker.com/engine/reference/run/#/entrypoint-default-command-to-execute-at-runtime

  • 只是为了澄清(顺序很重要)-在“运行”之后而不是在命令结束时.. (3认同)

web*_*ars 11

注意:回答这个老问题是因为提议的答案并不令我满意,因为它们部分错误。

简短回答: 无法使用多个参数覆盖入口点,但您可以将它们移动到可以工作的命令(图像名称后面的部分)


更详细的答案:

经过一些测试和阅读文档后,很明显没有办法用 docker run 来模仿 dockerfile 或 docker-compose 入口点行为。

建议的答案是覆盖单个二进制文件的入口点(即没有参数)并将原始参数放入命令中。

这通常可以完成工作,但实际上存在概念上的差异,您可以使用 来揭示docker inspect

在 docker 中,ENTRYPOINT 是二进制文件 + 将在启动时启动的默认参数,并且用户在正常使用时不应更改这些参数。COMMAND 是您希望用户更改的剩余参数或参数(例如: ping 的目标主机名)。因此它们在概念上是不同的。

说在许多情况下,对于一次性容器来说,将参数从入口点移动到命令并不重要,结果命令看起来是一样的。


Bru*_*sky 9

我认为这也值得注意:

如果你的docker run命令有很多参数,你--entrypoint应该先来.

我不知道我的哪个论点是问题,但--entrypoint "/bin/bash"最后并没有阻止从Dockerfile执行ENTRYPOINT.我的论点包括:

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

  • 基于 docker 文档,这就是为什么 - docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...] - 这是一个选项 (2认同)