当前位置: 首页 > 知识库问答 >
问题:

composer文件中的Docker健康检查

管杜吟
2023-03-14

问题是,我的数据库容器需要比启动我的主应用程序的容器更多的时间来启动和初始化数据库。结果:主容器无法正确启动,导致缺少数据库连接。我编写了一个healthcheck.sh脚本来检查数据库容器的连通性,因此主容器在连通性可用后开始引导。但我不知道如何在Dockerfile和我的docker-compose.yml中正确地集成它

healthcheck.sh类似于:

#!bin/bash
COUNTER=0
while [[ $COUNTER = 0 ]]; do
  mysql --host=HOST --user="user" --password="password" --database="databasename" --execute="SELECT 1";
  if [[ $? == 1 ]]; then
    sleep 1
    echo "Let's sleep again"
  else
    COUNTER=1
    echo "OK, lets go!"
  fi
done

mysql容器DockerFile:

FROM repository/mysql-5.6:latest
MAINTAINER Me

... some copies, chmod and so on 

VOLUME ["/..."]

EXPOSE 3306

CMD [".../run.sh"]

HEALTHCHECK --interval=1s --timeout=3s CMD ./healthcheck.sh
version: '2'
services:
  db:
    image: db image
    restart: always
    dns:
      - 10.
    ports:
      - "${MYSQL_EXTERNAL_PORT}:${MYSQL_INTERNAL_PORT}"
    environment:
      TZ: Europe/Berlin
  data:
    image: data image

  main application:
    image: application image
    restart: always
    dns:
      - 10.
    ports:
      - "${..._EXTERNAL_PORT}:${..._INTERNAL_PORT}"
    environment:
      TZ: Europe/Berlin
    volumes:
      - ${HOST_BACKUP_DIR}:/...
    volumes_from:
      - data
      - db

Thx马库斯

共有1个答案

阴波峻
2023-03-14

我相信这类似于Docker Compose在启动Y之前等待容器X

您的db_image需要支持curl。
为此,创建您自己的db_image如下:

FROM base_image:latest
RUN apt-get update
RUN apt-get install -y curl 
EXPOSE 3306

那么您应该只需要一个docker-compose.yml,它如下所示:

version: '2'
services:
  db:
    image: db_image
    restart: always
    dns:
      - 10.
    ports:
      - "${MYSQL_EXTERNAL_PORT}:${MYSQL_INTERNAL_PORT}"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:${MYSQL_INTERNAL_PORT}"]
      interval: 30s
      timeout: 10s
      retries: 5
    environment:
      TZ: Europe/Berlin
  main_application:
    image: application_image
    restart: always
    depends_on:
      db:
        condition: service_healthy
    links: 
        - db
    dns:
      - 10.
    ports:
      - "${..._EXTERNAL_PORT}:${..._INTERNAL_PORT}"
    environment:
      TZ: Europe/Berlin
    volumes:
      - ${HOST_BACKUP_DIR}:/...
    volumes_from:
      - data
      - db
 类似资料:
  • 我有一个ECS集群,它有多个节点(任务定义),由应用程序负载平衡器前置。在负载平衡器和容器级别(在任务定义内)配置健康检查有意义吗? 负载平衡器对每个注册的目标运行配置的健康检查,以便注销故障节点。在容器级别设置健康检查可以完成相同的事情:ECS将注销任何未通过健康检查的容器(根据您的配置)。ECS将始终实例化更多任务定义实例,以满足您所需的计数。 对我来说,如果任务定义只有一个容器,那么只在负载

  • SOFABoot 为 Spring Boot 的健康检查能力增加了 Readiness Check 的能力。如果你需要使用 SOFA 中间件,那么建议使用 SOFABoot 的健康检查能力的扩展,来更优雅的上线应用实例 引入健康检查扩展 要引入 SOFABoot 的健康检查能力的扩展,只需要引入以下的 Starter 即可: <dependency> <groupId>com.alipay

  • 如 mq,redis ,pgsql 检测健康状态的方式有哪些?检查能否连的上以及是否能正常使用 spring-boot-actuator好像可以实现,还有什么其它方式?

  • 健康检测是对应用进行check,判定应用是否在正常运行。 健康检测有三种方案 只对tcp端口进行检测 只通过http的方式check需要提供path地址 以上两种结合

  • 健康检查配置概述。 filter.http.HealthCheck filter.http.HealthCheck proto { "pass_through_mode": "{...}", "endpoint": "...", "cache_time": "{...}" } pass_through_mode (BoolValue, REQUIRED) 指定过滤器是否在传递模式下运

  • 健康检查架构概述。如果为集群配置了健康检查,则会发出相应的统计信息。详见请参考统计相关文档。 HealthCheck HealthCheck.Payload HealthCheck.HttpHealthCheck HealthCheck.TcpHealthCheck HealthCheck.RedisHealthCheck HealthCheck HealthCheck proto { "ti