保持Play框架应用程序在没有伪TTY的Docker容器中运行

Ilk*_*kka 9 playframework docker fig

我有一个开发设置,我需要多个容器运行不同的服务,我正在尝试使用Fig来实现这一点.其他一切工作正常,但其中一个服务是Play Framework应用程序,它不希望保持运行,除非它获得伪TTY.这样会很好,但是因为我想协调这些多个容器,我想fig up,并且该命令似乎没有分配伪TTY,因此进程在启动后立即死亡,并且所有容器都随之消失.

我已经创建了一个存储库,其中展示了这个问题,任何人都可以克隆并运行,说明书在README中.如果有人能够阐明如何创建例如中间人脚本以保持应用程序运行,或者实际上任何其他解决方案,我可以在fig up我的链接容器设置,这将是辉煌的.

或者,如果有人正在使用任何其他方法来协调这样的多个容器,就像一个管理事物的好的shell脚本运行器,我欢迎您的见解.

编辑:我改变了接受的答案,因为新答案实际上解决了问题.但是,解决方法的答案仍然有重要的信息.

Yev*_*man 11

图已被Docker Compose取代,在您的docker-compose.yml文件中,您现在可以添加stdin_open: true设置,这应解决此问题:

web:  
  image: brikis98/ping-play
  ports:
    - "9000:9000"
  stdin_open: true
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,brikis98/ping-play图像是activator run默认执行的Play应用程序.如果我docker-compose up在上面的YAML文件上运行,Play应用程序会启动并继续运行而不是立即退出.


flu*_*rdy 6

玩!通过图编排的运行命令目前将始终在启动后退出.如果您恢复了图创建的容器(docker start -i),则会出现相同的行为.基本上这反映会发生什么,当你作为一个码头工人的背景守护程序可通过运行命令启动播放/ SBT /激活REPL它也将退出(搬运工运行-d).

Ilkka已经评论过的解决方法是将Play应用程序打包成能够自行运行.通过舞台和/或开始命令https://playframework.com/documentation/2.3.x/Production或通过https://playframework.com/documentation/2.3.x/ProductionDist分发.

例如,如果Docker镜像包含应用程序源,则可以向其添加stage命令

ADD myapplication /var/local/application

WORKDIR /var/local/application 

RUN /usr/local/bin/activator stage
Run Code Online (Sandbox Code Playgroud)

在fig.yml中你的命令可以

command: target/universal/stage/bin/myapplication
Run Code Online (Sandbox Code Playgroud)

您可以使用此Docker Compose(图的后续)项目查看示例Dockerfileyml文件