Docker-compose:如何知道容器内的jar何时完成运行并稍后启动其他容器

时间:2017-09-14 21:26:09

标签: java docker docker-compose

我有多个容器,我在每个容器中运行不同的jar,但是其中一个jar需要在一个jar完成后运行,所以我使用了docker-compose.yml的depends_on属性但是这只有在容器完成时才有效,而不是jar,所以如何判断一个容器要等到另一个容器内的jar开始,

这是我的docker-compose.yml文件:

version: '3.3'
services:
  cloudconfig:
    image: cloudconfig
    ports:
      - "8001:8001"
    hostname: cloudconfig
    container_name: cloudconfig
  eureka1:
    image: eureka
    ports:
      - "8011:8011"
    hostname: eureka-primary
    container_name: eureka-primary
    environment:
      - perfil=-Dspring.profiles.active=primary
  eureka2:
    image: eureka
    hostname: eureka-secondary
    container_name: eureka-secondary
    environment:
      - perfil=-Dspring.profiles.active=secondary
  eureka3:
    image: eureka
    hostname: eureka-tertiary
    container_name: eureka-tertiary
    environment:
      - perfil=-Dspring.profiles.active=tertiary
  mscargos:
    depends_on: 
      - "eureka1"
      - "eureka2"
      - "eureka3"
    image: mscargos
    hostname: mscargos
    container_name: mscargos
  zuul:
    depends_on:
      - "mscargos"
    image: zuul
    ports:
      - "8125:8125"
    hostname: zuul
    container_name: zuul

提前致谢

1 个答案:

答案 0 :(得分:0)

没有干净的方法,只有解决方法。

官方documentation您必须使用外部工具,例如./wait-for-it.sh

  

使用wait-for-it,dockerize或sh-compatible等待等工具。   这些是小包装脚本,您可以将其包含在您的脚本中   应用程序的图像并将轮询给定的主机和端口,直到它为止   接受TCP连接。

您需要做的是实现一些REST端点,一旦容器准备好就会返回HTTP 200。依赖容器必须命中此端点,直到它获得HTTP 200,然后才启动主进程。

您可以使用以下内容:

Dockerfile:

ADD wait-for-it.sh /wait-for-it.sh

搬运工-compose.yml:

command: bash -c "./wait-for-it.sh your-servise:8080 && java -jar your-app.jar"

还有更简单直接的前进方式,不需要实现任何API。您只需在需要其他人活着的进程之前添加一些睡眠命令。

这样你的作品可能会是这样的:

command: bash -c "sleep 60s && java -jar your-app.jar"

但是,您应该调查此方法是否适用于您的情况。

注意:我使用java -jar your-app.jar作为示例,但您可能有一些不同的命令(甚至不是java)。只需用开始流程的方式替换这部分。