当前位置: 首页 > 知识库问答 >
问题:

entrypoint脚本中的Docker exec命令失败

邹嘉致
2023-03-14

按照在CMD之前执行脚本的建议(我需要在容器重新启动之前清除一个临时dir,以修复一个bug),我将docker文件从使用CMD修改为entrypoint,如下所示:

entryPoint[“/app/entryPoint.sh”,“/usr/bin/java-dlog4j.configurationfile=/app/resources/linux/${LOG4J_FILE}-dpa.config=/app/resources/linux/${CONFIG_FILE}-jar/app/app.jar”]

并且在入口点文件中,在rm-rf命令之后结束:

执行“$@”

但是docker无法启动容器,它退出,容器日志显示:

+exec'/usr/bin/java-dlog4j.configationfile=/app/resources/linux/${LOG4J_FILE}-dpa.config=/app/resources/linux/${CONFIG_FILE}-jar/app/app.jar'/app/entrypoint.sh:line 7:/usr/bin/java-dlog4j.configationfile=/app/resources/linux/${LOG4J_FILE}-dpa.怎么啦?


共有1个答案

陆英毅
2023-03-14

您需要将JSON-array-format命令行分解成单独的单词。由于您已经显式地告诉Docker它的“command”部分是一个单词,所以它在/usr/bin中查找一个名为java-dlog4j.configurationfile=...的二进制文件,其中的空格和选项等都是文件名的一部分,但没有找到它。

您通常不希望在entrypoint中嵌入要运行的命令,尤其是在使用此包装器布局时。使entrypoint只是以exec“$@”结尾的脚本的名称;它必须使用JSON-array语法。使cmd成为您想要运行的实际命令,使用哪种语法更方便。(如果您试图展开环境变量,那么面向shell的语法可能会更好。)

ENTRYPOINT ["/app/entrypoint.sh"]
CMD /usr/bin/java \
  -Dlog4j.configurationFile=/app/resources/LINUX/${LOG4J_FILE} \
  -Dpa.config=/app/resources/LINUX/${CONFIG_FILE} \
  -jar /app/app.jar

我发现这种模式非常常见和有用,因此我通常建议只对这类包装器脚本使用entrypoint;即使没有入口点包装器,也更喜欢将启动应用程序的命令设置为cmd

 类似资料:
  • 问题内容: 我正在尝试构建自定义的tcserver docker映像。但是我在启动Web服务器和tomcat时遇到了一些问题。 据我了解,我应该使用ENTRYPOINT运行我想要的命令。 问题是,是否可以使用ENTRYPOINT运行多个命令? 还是应该创建一个小的bash脚本来全部启动? 基本上我想做的是: 但是我不知道这是否是一个好习惯,或者是否可行。 问题答案: 如果要在入口点运行许多命令,最

  • 问题内容: 我正在尝试在MySQL容器启动时创建多个数据库。根据https://github.com/docker- library/mysql/pull/18 ,我可以在映像的中装载或复制脚本,它们将在启动时自动执行。 但是我的脚本根本没有执行。好像在目录中看不到文件。 这是我的Dockerfile: 这是我的: 我构建并运行容器: 当我在tty中访问容器时,可以看到处于,但未执行。 我看到了输

  • 问题内容: 我是高级新手,请多多包涵。 我已经从另一位工程师那里继承了python脚本。为了方便起见,我希望能够从Windows bat文件启动脚本,但最初尝试通过从Windows命令行运行进行调试。 每当我从CMD启动脚本时,它似乎都可以启动,然后立即因错误而失败。 我的环境:Windows7 Pro和Windows10 Pro(发生相同的错误),Anaconda 3.7,Spyder 3.3.

  • 我已经通过Anaconda安装了Qiskit,并在Python 3.8中设置了一个虚拟环境。当我在Anaconda提示符中运行命令时,我得到一个错误。我不确定是什么问题。我怎么修理它? 已满足要求:c:\users\brenm\anaconda3\envs.venv\lib\site软件包中的qiskit(0.23.1)已满足要求:c:\users\brenm\anaconda3\envs.ven

  • 问题内容: 我前一段时间读过这篇文章,但似乎找不到。我试图找到一个将在终端中执行命令然后输出结果的命令。 例如:脚本将是: 它将在终端中运行该命令的结果 问题答案: 做这件事有很多种方法: 一种简单的方法是使用os模块: 子流程模块可以实现更复杂的事情:例如:

  • 问题内容: 我经常被要求调试别人编写的Python脚本。我想将这些脚本发送到IPython,这样它将在脚本失败时落入IPython Shell中。 不幸的是,我找不到发送脚本所需的命令行选项的方法。 当我通过以下方式传递脚本及其选项时,IPython假定其中的所有内容均适用于IPython: 有解决方案或解决方法吗? 问题答案: