使用 Docker 的健康检查功能,等待容器服务启动完成

概述

当使用docker-compose的depends_on指定容器的依赖关系时,可以控制容器的启动顺序,但不能保证容器是否正常运行。所以,常常会遇到需要在应用程序中使用wait-for-it等方式来检查中间件容器是否已经正确启动的问题。

で、 docker に healthcheck 機能があって、
https://dev.classmethod.jp/articles/docker-healthcheck/
これを使うと依存してるコンテナが healthy になるまで起動を待たせられるっていう話。

我試試看

我会在 alpine 上安装 Redis 并尝试运行。

FROM alpine:latest

RUN apk add make redis
node1:    # 待たされる側
    @ echo "$@ is running!"
    redis-cli -h node2 ping

node2:    # 待たせる側
    @ echo "$@ started!"
    sleep 3    # 3秒待ってから
    redis-server --protected-mode no    # redis-server を起動
    @ echo "$@ ended!"
version: '3'

services:
  node1:
    image: hoge
    build:
      context: .
    command: make -f /mnt/Makefile node1
    depends_on:
      node2:    # node2 の healthcheck が通るまで起動を待つ
        condition: service_healthy
    volumes:
      - .:/mnt

  node2:
    image: hoge
    build:
      context: .
    command: make -f /mnt/Makefile node2
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 1s
      timeout: 30s
      retries: 30
    volumes:
      - .:/mnt

这样就可以了

$ docker-compose build

进行/执行

$  docker-compose up

すると、 node2 側で redis の起動前に 3秒 sleep してる間は healthcheck の redis-cli ping が通らないので、
node1 の起動も待たされる挙動が確認できます。

$ docker-compose up
Creating network "docker_default" with the default driver
Creating docker_node2_1 ... done
Creating docker_node1_1 ... done
Attaching to docker_node2_1, docker_node1_1
node2_1  | node2 is started!
node2_1  | sleep 3    # 3秒待ってから
node1_1  | node1 is running!
node1_1  | redis-cli -h node2 ping
node2_1  | redis-server --protected-mode no    # redis-server を起動
node2_1  | 22:C 22 Dec 2020 09:38:25.036 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
node2_1  | 22:C 22 Dec 2020 09:38:25.036 # Redis version=5.0.9, bits=64, commit=869dcbdc, modified=0, pid=22, just started
node2_1  | 22:C 22 Dec 2020 09:38:25.036 # Configuration loaded
node1_1  | PONG
node2_1  | 22:M 22 Dec 2020 09:38:25.039 * Running mode=standalone, port=6379.
node2_1  | 22:M 22 Dec 2020 09:38:25.039 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
node2_1  | 22:M 22 Dec 2020 09:38:25.039 # Server initialized
node2_1  | 22:M 22 Dec 2020 09:38:25.039 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
node2_1  | 22:M 22 Dec 2020 09:38:25.040 * Ready to accept connections
docker_node1_1 exited with code 0

っていう話。

对比。

广告
将在 10 秒后关闭
bannerAds