Docker-compose:如何知道容器内的jar何时运行完毕,然后启动其他容器

我有多个容器,我在每个内部运行不同的jar,但其中一个jar需要运行一个jar完成后,所以我用我的depends_on -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 

提前致谢

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

官方文档说你必须使用外部工具,比如./wait-for-it.sh

使用等待,dockerize或sh兼容的等待工具。 这些小包装脚本可以包含在应用程序的映像中,并轮询给定的主机和端口,直到它接受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)。 只需用你开始你的过程的方式来replace这个部分。