在Docker容器中保持Play框架应用程序的运行而不需要伪终端(pseudo-TTY)。

9
我有一个开发设置,需要运行不同服务的多个容器,并尝试使用Fig来实现。除此之外,一切都正常,但其中一个服务是Play Framework应用程序,它不想保持运行状态,除非它获得伪TTY。这本来很好,但由于我想协调这些多个容器,我想要fig up,而该命令似乎不会分配伪TTY,因此进程在启动后立即死亡,所有容器也随之死亡。
我创建了一个展示此问题的存储库,任何人都可以克隆并运行,说明在README中。如果有人能够解决如何创建例如中间人脚本以保持应用程序运行状态,或者任何其他解决方案,使我能够fig up我的链接容器设置,那将是很棒的。
或者,如果有人正在使用其他方法来协调多个容器,例如管理事物的良好shell脚本运行程序,我欢迎您的见解。

编辑:我改变了接受的答案,因为新的答案实际上解决了问题。然而,绕过的答案仍然有宝贵的信息。


哎,我放弃了。由于Play框架包含sbt本地打包程序,因此可以使用./activator docker:stage进行构建和运行。请参阅http://www.scala-sbt.org/sbt-native-packager/DetailedTopics/docker.html。 - Ilkka
3个回答

11

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

web:  
  image: brikis98/ping-play
  ports:
    - "9000:9000"
  stdin_open: true
在上面的示例中,brikis98/ping-play镜像是一个Play应用程序,其默认情况下执行activator run。如果我在上面的YAML文件中运行docker-compose up,则Play应用程序会启动并继续运行,而不会立即退出。

6
通过Fig编排的Play!运行命令在启动后将会一直退出。如果您恢复了Fig创建的容器(docker start -i),它的行为与之相同。基本上,这就是当您通过将运行命令作为Docker后台守护程序启动Play/SBT/Activator REPL时发生的情况,它也会退出(docker run -d)。
Ilkka已经评论过的解决方法是将Play应用打包以使其能够自行运行。可以通过stage和/或start命令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

在fig.yml文件中,您的命令可以是:

command: target/universal/stage/bin/myapplication

您可以使用这个Docker Compose(Fig的继任者)项目,查看一个例子的Dockerfileyml文件


0

fig run 应该使用 TTY 终端。所以你可以尝试

fig run test ./activator start

谢谢,但那并不能做到 up 所能做的。 - Ilkka

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