dokcer depends_on 用于在 doker compose 中定义容器的依赖关系,及先启动哪个容器,在这个容器启动之后才能启动另外一个容器。
但这会存在一个问题,当一个容器开始运行,但是它其实并没有完全启动的时候,依赖它的容器尽管定义了依赖关系,仍然会启动失败(依赖的容器只是开始运行,并没有进入到可以提供服务的阶段)。
我们可以使用 docker 的 HEALTHCHECK 解决这个问题。docker 的 HEALTHCHECK 可以给容器增加两个状态:healthy 和 unhealthy。在 Dockerfile 中使用 HEALTHCHECK 来构建一个容器,具体的语法如下:
HEALTHCHECK --interval=xx --timeout=xx --retries=xx CMD <cmd to check if the container is healthy>
返回的结果表示一个容器是否健康:0:健康,1:不健康(还有一个 2 值,处于保留中)。
举个例子:
容器 platform-configuration 的 Dockerfile:
FROM openjdk:12-alpine
MAINTAINER icyfenix
ENV SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \
JAVA_OPTS="" \
PORT=8888 \
PROFILES="native"
ADD /target/*.jar /config.jar
RUN apk update && apk add curl && rm -rf /var/cache/apk/*
HEALTHCHECK --interval=5s --timeout=30s CMD curl -f http://localhost:$PORT/actuator/health || exit 1
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /config.jar --spring.profiles.active=$PROFILES"]
EXPOSE $PORT
docker-compose.yaml 的一部分
platform-gateway:
image: icyfenix/bookstore-springcloud:platform-gateway
depends_on:
platform-configuration:
condition: service_healthy
platform-registry:
condition: service_healthy
environment:
CONFIG_HOST: platform-configuration
REGISTRY_HOST: platform-registry
restart: always
ports:
- 8080:8080
(以上代码出自fenixsoft/microservice_arch_springcloud: 基于SpringCloud实现的微服务架构示例工程。《软件架构探索》的配套组件。 (github.com))