![](/img/trans.png)
[英]Docker-compose and race condition on container depending on other container
[英]Docker-compose: how to know when jar inside a container finish to run and later start other container
我有多個容器,每個容器都運行不同的jar,但是其中一個jar需要在一個jar完成啟動后運行,因此我使用了depends_on
-compose.yml的depends_on
屬性,但這僅在容器完成后才有效,而不是罐子,所以我該如何告訴一個容器等待,直到另一個容器中的罐子開始啟動,
這是我的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
。
使用諸如wait-for-it,dockerize或與sh兼容的wait-for之類的工具。 這些是小的包裝腳本,您可以將其包含在應用程序的映像中,並將輪詢給定的主機和端口,直到它接受TCP連接為止。
您要做的是實現一些REST終結點,一旦容器准備好,該終結點將返回HTTP 200。 從屬容器必須一直命中此端點,直到它獲得HTTP 200,然后才啟動主進程。
您可以使用如下形式:
Dockerfile:
ADD wait-for-it.sh /wait-for-it.sh
docker-compose.yml:
command: bash -c "./wait-for-it.sh your-servise:8080 && java -jar your-app.jar"
還有一種更簡單,更嚴格的轉發方式 ,它不需要任何API的實現。 您可以簡單地在要求其他命令處於活動狀態的過程之前添加一些sleep命令。
這樣,您的撰寫可能如下所示:
command: bash -c "sleep 60s && java -jar your-app.jar"
但是,您應該調查這種方法是否適合您的情況。
注意:我以java -jar your-app.jar
為例,但您可能有一些不同的命令(即使不是Java)。 只需用開始過程的方式替換此部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.