Docker-compose守护进程退出

所以我在Docker中使用了Play框架(特别是使用这个镜像),并试图让服务器正常运行。

$ sudo docker-compose run web activator run 

正如预期的那样工作:Web服务器启动并保持接受传入的请求。

但是,我尝试

 $ sudo docker-compose up -d 

 $ sudo docker-compose logs ... web_1 | [info] [SUCCESSFUL ] org.ow2.asm#asm-analysis;4.1!asm-analysis.jar (16ms) web_1 | [info] downloading file:/activator-1.3.2/repository/org.ow2.asm/asm-util/4.1/jars/asm-util.jar ... web_1 | [info] [SUCCESSFUL ] org.ow2.asm#asm-util;4.1!asm-util.jar (32ms) web_1 | [info] Done updating. web_1 | web_1 | --- (Running the application from SBT, auto-reloading is enabled) --- web_1 | web_1 | [info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000 web_1 | web_1 | (Server started, use Ctrl+D to stop and go back to the console...) web_1 | web_1 | web_1 | [success] Total time: 356 s, completed May 11, 2015 6:44:20 AM shallwedebate_web_1 exited with code 0 amos@lub:/ShallWeDebate$ sudo docker-compose ps Name Command State Ports ------------------------------------------------------------------------- shallwedebate_da /docker- Up 5432/tcp tabase_1 entrypoint.sh postgres shallwedebate_we activator run Exit 0 b_1 

它退出! 这是为什么? 为什么它不像docker-compose run

编辑 – 我docker-compose.yml文件

 database: image: postgres:9.1 volumes: - /ShallWeDebate/postgres-entrypoint:/docker-entrypoint-initdb.d:ro env_file: - ./vars.env web: image: ingensi/play-framework volumes: - /ShallWeDebate:/app:rw env_file: - ./vars.env links: - database ports: - "80:9000" 

问题与Play框架有关。 当用activator运行你的应用程序时,它会尝试附加到标准input等待Ctrl + D来完成应用程序。 Play Framework现在不支持使用activator命令而不使用stdin运行应用程序。 你find了一个解决方法来使这个工作(从一个交互式的docker容器中运行你的应用程序)。 也许你可以用一些简单的方法来解决这个问题,以某种方式分配伪tty,但是最好的解决scheme是Play Framework支持这个function。 有一些与这个问题相关的问题: typesafehub / activator#939 , playframework / playframework#4001

如果您需要一个可以在开发模式下使用Play应用程序而不是生产模式的解决scheme,则可以将stdin_open: true设置添加到您docker-compose.yml文件中:

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

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