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)