如何在Dockerfile中退出CMD

3
我尝试通过以下语法组合在Docker内部启动服务器:
  1. CMD [ "forever", "start", "server/server.js" ]
  2. CMD [ "forever", "start", "server\/server.js" ]
  3. CMD forever start server/server.js
但是每一种方法都失败了。前两种运行结果为 "forever start server",注意缺失的/server.js部分。
最后一种方法运行结果为"/bin/sh -c 'forever "
因此,在Dockerfile中以分离的容器运行forever start server/server.js的正确语法是什么?

3
创建一个脚本,将其复制到您的容器中,并将其设置为您的 CMD 命令? - Sobrique
很好,作为一种解决方法已经点赞了,但仍在寻求语法解决方案的回复 :) - pulkitsinghal
你的命令中的 sh -c 是什么意思? - user2915097
@user2915097 - 不确定你在问我什么。 - pulkitsinghal
我在问你阿明·布劳恩写了什么。 - user2915097
2个回答

1
我刚刚遇到了在运行 Java 应用程序时在 Docker 容器内启动它的相同问题。
从 Docker 参考中,您有三个机会:
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

请看这里:Docker CMD

我不熟悉JavaScript,但是假设你想要启动的应用程序是Java应用程序:

CMD ["/some path/jre64/bin/java", "server.jar", "start", "forever", ...]

正如你评论中的其他人所说,您还可以通过在Dockerfile中使用ADDCOPY命令将脚本添加到docker中,并使用RUN命令启动它。

另一种解决方案是运行docker容器并通过docker run .. -v HOSTDIR:CONTAINERDIR在容器内挂载一个包含所需脚本的目录,并使用docker exec命令触发该脚本。

请参阅此处:Docker Filemounting + Docker Exec


谢谢!我在原始问题中列出的非功能排列是基于Docker CMD文档的。一旦确定没有人知道适当的语法,我将开始评估解决方法。 - pulkitsinghal

0

按评论中建议的方式运行:sh -c, 语法如下:

CMD["/bin/sh", "-c", "'forever start server/server.js'"]

如果您的工具需要登录Shell才能运行,可以尝试使用此选项:

CMD["/bin/bash", "-lc", "'forever start server/server.js'"]

这应该可以正常工作,具有将命令放入标准 sh shell 中的单行效果。


1
没起作用,但我会深入挖掘原因并回复。 - pulkitsinghal
更新第二个备选方案,也许只是登录 shell 的问题? - Armin Braun
1
所以一位乐于帮助的导师透露,除非命令在前台运行,否则容器会立即停止。因此,我添加了一个前台 tail 命令:forever start server/server.js && tail -f $(forever list | grep 'server/server.js' | awk '{print $8}'); - pulkitsinghal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接