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