Playframework 让Play framework应用程序在Docker容器中运行而不使用伪TTY

Playframework 让Play framework应用程序在Docker容器中运行而不使用伪TTY,playframework,docker,fig,Playframework,Docker,Fig,我有一个开发设置,需要多个容器运行不同的服务,我正试图使用它来实现这一点。其他一切都可以正常工作,但其中一个服务是Play Framework应用程序,它不想继续运行,除非它得到一个伪TTY。这很好,但是因为我想协调这些多个容器,所以我想fig up,并且该命令似乎没有分配伪TTY,因此进程在启动后立即死亡,所有容器也随之死亡 我创造了任何人都可以克隆并运行的程序,说明在自述文件中。如果有人能解释如何创建一个中间人脚本来保持应用程序的运行,或者任何其他解决方案,我可以fig-up我的链接容器设置

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

我创造了任何人都可以克隆并运行的程序,说明在自述文件中。如果有人能解释如何创建一个中间人脚本来保持应用程序的运行,或者任何其他解决方案,我可以
fig-up
我的链接容器设置,那就太棒了

或者,如果有人正在使用任何其他方法来协调多个容器,比如一个优秀的shell脚本运行程序来管理事情,我欢迎您的见解


编辑:我更改了接受的答案,因为新答案实际上解决了问题。不过,解决方法的答案仍然包含有价值的信息。

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

fig run test ./activator start

一出戏!当前通过Fig编排的run命令在启动后将始终退出。如果恢复Fig创建的容器(docker start-i),则会出现相同的行为。基本上,这反映了当您作为Docker后台守护进程通过run命令启动Play/SBT/Activator REPL时发生的情况,它也将退出(Docker run-d)

Ilkka已经评论过的解决方法是打包Play应用程序,使其能够独立运行。通过stage和/或start命令或通过分发

例如,如果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的继任者)项目

Fig已被替换,并且在您的
Docker Compose.yml
文件中,您现在可以添加
stdin\u open:true
设置,该设置将解决此问题:

web:  
  image: brikis98/ping-play
  ports:
    - "9000:9000"
  stdin_open: true

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

谢谢,但这与up的功能不同。Walp,我放弃了。由于Play Framework包含sbt本机打包程序,因此可以
/activator docker:stage
,然后运行并构建它。看见