我有入口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的角度来看,但显然脚本失败了
这是因为您在命令周围使用了引号。
当您运行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
我认为这也值得注意:
docker run
命令有一堆参数,你的--entrypoint
应该是第一位的。我不知道我的哪个论点是问题,但最后放--entrypoint "/bin/bash"
并不妨碍从Dockerfile执行ENTRYPOINT。我的论点包括:
根据官方的docker文档,我不确定你能做到这一点:
注意:您可以使用--entrypoint覆盖ENTRYPOINT设置,但这只能将二进制设置为exec(不使用sh -c)。
https://docs.docker.com/engine/reference/builder/#/environment-replacement