我有多个容器,我在每个容器中运行不同的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
提前致谢
答案 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)。只需用开始流程的方式替换这部分。