9

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

我创建了一个存储库,展示了这个问题,任何人都可以克隆并运行,说明在自述文件中。如果有人可以阐明如何创建例如可以保持应用程序运行的中间人脚本,或者真正可以fig up设置链接容器的任何其他解决方案,那就太好了。

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

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

4

3 回答 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如果我docker-compose up在上面的 YAML 文件上运行,Play 应用程序会启动并继续运行,而不是立即退出。

于 2015-05-11T20:38:35.560 回答
6

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

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

例如,如果 Docker 映像包含应用程序源,那么您可以将阶段命令添加到它

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(图的继任者)项目查看示例 Dockerfileyml 文件

于 2014-12-04T10:45:55.737 回答
0

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

fig run test ./activator start
于 2014-11-11T17:06:22.670 回答