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

新手上路,请多包涵

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

我有工作 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 的角度工作,但显然脚本失败

原文由 Patrik Mihalčin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 521
2 个回答

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

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

原文由 Adrian Oprea 发布,翻译遵循 CC BY-SA 3.0 许可协议

我认为这也值得注意:

如果您的 docker run 命令有一堆参数,那么您的 --entrypoint 应该排在第一位。

我不知道我的哪个论点是问题所在,但是将 --entrypoint "/bin/bash" 放在最后并不能阻止从 Dockerfile 执行 ENTRYPOINT。我的论点包括:

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

原文由 Bruno Bronosky 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题