Docker Compose怎么保证其他服务在Nacos完全启动后再启动

首先,docker compose有一个关键字depends_on是可以一定程度解决services之间的依赖问题,但是depends_on仅仅只是指定了services的启动顺序,并不能保证,前置service完全启动后,后置service才启动。

此时,需要另一个关键字叫healthcheck

样例

nacos版本为v2.3.0

yaml 复制代码
  mysql_nacos:
    container_name: mysql_nacos
    build:
      context: .
      dockerfile: ./image/mysql/5.7/Dockerfile
    image: example/mysql:5.7
    env_file:
      - ../env/mysql.env
    volumes:
      - ./mysql:/var/lib/mysql
#    ports:
#      - "3307:3306"
    healthcheck:
      test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}" ]
      interval: 10s
      timeout: 10s
      retries: 10
        
  nacos1:
    hostname: nacos1
    container_name: nacos1
    image: nacos/nacos-server:${NACOS_VERSION}
    volumes:
      - ./cluster-logs/nacos1:/home/nacos/logs
#    ports:
#      - "7848:7848"
#      - "8845:8848"
#      - "9868:9848"
#      - "9850:9849"
    env_file:
      - ../env/nacos-hostname.env
#    restart: always
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:8848/nacos/v1/console/health/readiness" ]
      interval: 10s
      timeout: 10s
      retries: 10
    depends_on:
      mysql_nacos:
        condition: service_healthy
        
  nginx_nacos:
    hostname: nginx_nacos
    image: nginx:stable
    container_name: nginx_nacos
    volumes:
      - ../nginx_nacos/nginx.conf:/etc/nginx/nginx.conf
      - ../nginx_nacos/conf.d/default.conf:/etc/nginx/conf.d/default.conf
      - ../nginx_nacos/logs:/var/log/nginx
      - ../nginx_nacos/html:/usr/share/nginx/html
    ports:
      - "80:80"
    depends_on:
      nacos1:
        condition: service_healthy

这是一个双层依赖,nginx_nacos依赖于nacos1,同时nacos1依赖于mysql_nacos

mysql_nacos基于 healthcheck:test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}" ]来确认自己的健康状态,只有当test内容执行成功并返回状态码0,才会认为此service已完全执行成功。

同理nacos服务是基于healthcheck:test: [ "CMD", "curl", "-f", "http://localhost:8848/nacos/v1/console/health/readiness" ]来判断健康状态的。

相关推荐
阿智@116 分钟前
Node.js 助力前端开发:自动化操作实战
运维·前端·node.js·自动化
赤叶丶秋枫8 分钟前
Jenkins入门使用
运维·jenkins
紫菜(Nori)8 分钟前
Jenkins Api Token 访问问题
运维·jenkins
love530love25 分钟前
Windows 11 中利用 WSL - Linux 虚拟环境部署 ChatTTS-Enhanced 项目教程
linux·运维·windows
冷曦_sole29 分钟前
linux-22 目录管理(二)rmdir命令,删除目录
linux·运维·服务器
群联云防护小杜39 分钟前
服务器被攻击怎么办
运维·服务器·网络·网络协议·安全·web安全
颜淡慕潇1 小时前
【K8S问题系列 | 20 】K8S如何删除异常对象(Pod、Namespace、PV、PVC)
后端·云原生·容器·kubernetes
lmxnsI1 小时前
docker使用笔记
笔记·docker·容器
木卫二号Coding1 小时前
Docker-构建自己的Web-Linux系统-镜像webtop:ubuntu-kde
linux·ubuntu·docker
IT 古月方源2 小时前
ospf 的 状态机详解
运维·网络·tcp/ip·智能路由器