docker-compose 中 depends_on 的作用

news2024/12/25 11:08:25

文章目录

    • depends_on 介绍
    • depends_on 有一个长定义模式
      • condition 说明
      • required 说明
    • 参考文档

depends_on 介绍

在 Docker Compose 中,depends_on 是一个用于定义服务之间依赖关系的关键字。它允许您指定一个或多个服务依赖于其他服务,以确保在启动或重新创建容器时,所依赖的服务先于依赖它们的服务启动。

以下是一些关于 depends_on 的详解:

  1. 启动顺序:通过在服务的配置中使用 depends_on,您可以告诉 Docker Compose 在启动容器时按照指定的顺序启动服务。例如,如果服务 A 依赖于服务 B 和服务 C,则在启动时,Docker Compose 会先启动服务 B 和服务 C,然后才会启动服务 A。
  2. 仅表示依赖关系:depends_on 只表示依赖关系,而不会等待依赖的服务完全可用。它只确保在依赖的服务启动后再启动当前服务。因此,依赖的服务可能仍在进行初始化或准备阶段,而不一定已经完全可用。如果需要等待服务完全可用,可以结合使用其他工具或技术,例如健康检查或等待脚本。
  3. 无法保证健康状态:depends_on 并不能保证依赖的服务在启动后处于健康状态。它只负责在启动时按照指定顺序启动服务,但并不检查服务的健康状态或等待服务变为可用状态。对于检查服务健康状态,可以使用其他机制,例如使用健康检查命令或工具。
  4. 并行启动:默认情况下,Docker Compose 会尽可能并行启动服务,而不是完全按照 depends_on 指定的依赖关系顺序启动。这是因为 Docker Compose 会尝试最大化容器的并发启动,以提高启动效率。如果需要强制按照依赖关系顺序启动,请使用 depends_on 结合 restart 关键字的 condition: ["service_started"] 选项。

综上所述,depends_on 关键字允许您定义 Docker Compose 服务之间的依赖关系,但它并不能保证服务的可用性或健康状态。

docker-compose.yml 样例文件

version: '3'

services:
  rabbitmq:
    hostname: rabbitmq_host
    container_name: 'mq'
    image: rabbitmq:3.9.11-management
    restart: always
    ports:
      - "5772:5672"  # AMQP
      - "15772:15672"  # Web UI
    networks:
      - app-network
    environment:
      RABBITMQ_DEFAULT_USER: root
      RABBITMQ_DEFAULT_PASS: pwd
      RABBITMQ_DEFAULT_VHOST: /
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq/mnesia

    healthcheck:
      test: [ "CMD", "rabbitmq-diagnostics", "ping" ]
      interval: 50s
      timeout: 5s
      retries: 3


  selenium:
    container_name: 'selenium'
    image: selenium/standalone-chrome
    restart: always
    ports:
      - "4444:4444"

    networks:
      - app-network

    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:4444/wd/hub/status" ]
      interval: 30s
      timeout: 5s
      retries: 3


  db:
    container_name: 'mysql8'
    image: mysql:8.0.32
#    hostname: mysql_host
    user: root
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci

    environment:
      LANG: C.UTF-8
      MYSQL_ROOT_PASSWORD: pwd
      MYSQL_DATABASE: yinlian

    ports:
      - "3306:3306"

    volumes:
      - "./data/db/data:/var/lib/mysql"
      - "./data/db/mysql-files:/var/lib/mysql-files"
      - "./build/docker/mysqldb/my.cnf:/etc/my.cnf"

    networks:
      - app-network

    healthcheck:
      test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ]
      interval: 30s
      timeout: 5s
      retries: 3

  app-producer:
    container_name: 'producer'
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8001:8001"

    command: ['echo','hello world, Frank']
    depends_on:
      - db
      - rabbitmq
      - selenium

    networks:
      - app-network


networks:
  app-network:
    driver: bridge

volumes:
  rabbitmq_data:
    driver: local

上面的 文件中定义了 rabbitmq , db, selenium ,以及 app-producer , 其中 app-producer 服务 依赖于 其他三个服务, 这个时候如何进行配置呢?

depends_on 只能保证启动的顺序.

那么如何解决 保证 服务启动后,才启动app-producer 服务呢? 为此需要 使用长定义模式

depends_on 有一个长定义模式

Long syntax

The long form syntax enables the configuration of additional fields that can’t be expressed in the short form.

  • restart: When set to true Compose restarts this service after it updates the dependency service. This applies to an explicit restart controlled by a Compose operation, and excludes automated restart by the container runtime after the container dies.
  • condition: Sets the condition under which dependency is considered satisfied
    • service_started: An equivalent of the short syntax described above
    • service_healthy: Specifies that a dependency is expected to be “healthy” (as indicated by healthcheck) before starting a dependent service.
    • service_completed_successfully: Specifies that a dependency is expected to run to successful completion before starting a dependent service.
  • required: When set to false Compose only warns you when the dependency service isn’t started or available. If it’s not defined the default value of required is true.

condition 说明

下面的文件中 我定义了一个web , db 服务, 此时 web 服务 启动就需要等待 db启动 并且成功后,才能启动.

condition 的含义 service_healthy 做健康检查

service_completed_successfully 表示 容器正常退出了, 之后 才进行启动.

service_started 只保证启动顺序, 并不做任何检查.

services:
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy

  db:
    image: mysql:latest
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 3s
      retries: 3

service_completed_successfully 参数是长定义语法中的一个字段,用于指定依赖服务在成功完成后,才启动相关的服务。

当将 service_completed_successfully 设置为 true 时,它表示依赖服务必须完全运行并成功完成(即退出状态码为 0),才能启动相关的服务。

让我们通过一个示例来说明该参数的含义。假设我们有一个应用程序,其中包含一个 worker 服务和一个 db_migration 服务。我们希望在启动 worker 服务之前,先运行 db_migration 服务,并确保 db_migration 服务成功完成数据库迁移操作。

使用长定义语法,我们可以将 depends_on 部分扩展为以下形式:

services:
  worker:
    build: .
    depends_on:
      db_migration:
        condition: service_completed_successfully

  db_migration:
    build: .
    command: ./run_migration.sh

在上述示例中,我们在 worker 服务的 depends_on 部分使用长定义语法来定义 db_migration 服务的依赖。通过将 condition 字段设置为 service_completed_successfully,我们指定了 worker 服务依赖于 db_migration 服务成功完成。

当我们使用 Docker Compose 启动应用程序时,Compose 将先运行 db_migration 服务,并等待其成功完成(即退出状态码为 0)。一旦 db_migration 服务成功完成,Compose 将启动 worker 服务。

通过使用 service_completed_successfully 参数,我们可以确保依赖服务在成功完成后,再启动相关的服务。这对于需要在依赖服务成功完成后才能进行后续操作的场景非常有用,如数据库迁移、初始化脚本等。

service_started 这个只是表示启动顺序,并不能保证健康状态.

service_healthyservice_completed_successfully 是长定义语法中用于定义依赖服务的两个不同条件。

  • service_healthy:这个条件要求依赖服务处于健康状态(由健康检查指定),才会启动相关的服务。通过设置 condition: service_healthy,Compose 将等待依赖服务的健康状态后再启动相关服务。健康状态通常是通过在容器中运行健康检查命令或脚本来确定的,例如检查 HTTP 响应或数据库连接等。
  • service_completed_successfully:这个条件要求依赖服务成功完成(即退出状态码为 0),才会启动相关的服务。通过设置 condition: service_completed_successfully,Compose 将等待依赖服务成功完成后再启动相关服务。这通常用于需要确保特定操作或任务在依赖服务完成后才能进行的情况,例如数据库迁移、初始化脚本等。

总结一下它们的区别:

  • service_healthy 关注依赖服务的健康状态,它要求依赖服务处于健康状态才能启动相关服务。
  • service_completed_successfully 关注依赖服务的成功完成,它要求依赖服务在成功完成后(即退出状态码为 0)才能启动相关服务。

required 说明

在长定义语法中,required 字段用于指定依赖服务是否是必需的。它控制了当依赖服务未启动或不可用时的行为。

  • required 设置为 true默认值),如果依赖服务未启动或不可用,Compose 将阻止启动相关的服务,并显示警告信息。
  • required 设置为 false,Compose 仍会显示警告信息,但不会阻止启动相关的服务。相当于它是可选的,即使依赖服务未启动或不可用,相关服务仍会尝试启动。
services:
  web:
    build: .
    depends_on:
      database:
        required: false

  database:
    image: mysql:latest

下面看看一个完整的例子 docker-compose-test.yml:

version: '3'

services:
  rabbitmq:
    hostname: rabbitmq_host
    container_name: 'mq'
    image: rabbitmq:3.9.11-management
    restart: always
    ports:
      - "5772:5672"  # AMQP
      - "15772:15672"  # Web UI
    networks:
      - app-network
    environment:
      RABBITMQ_DEFAULT_USER: root
      RABBITMQ_DEFAULT_PASS: pwd
      RABBITMQ_DEFAULT_VHOST: /
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq/mnesia

    healthcheck:
      test: [ "CMD", "rabbitmq-diagnostics", "ping" ]
      interval: 50s
      timeout: 5s
      retries: 3


  selenium:
    container_name: 'selenium'
    image: selenium/standalone-chrome
    restart: always
    ports:
      - "4444:4444"

    networks:
      - app-network

    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:4444/wd/hub/status" ]
      interval: 30s
      timeout: 5s
      retries: 3


  db:
    container_name: 'mysql8'
    image: mysql:8.0.32
#    hostname: mysql_host
    user: root
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci

    environment:
      LANG: C.UTF-8
      MYSQL_ROOT_PASSWORD: pwd
      MYSQL_DATABASE: yinlian

    ports:
      - "3306:3306"

    volumes:
      - "./data/db/data:/var/lib/mysql"
      - "./data/db/mysql-files:/var/lib/mysql-files"
      - "./build/docker/mysqldb/my.cnf:/etc/my.cnf"

    networks:
      - app-network

    healthcheck:
      test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ]
      interval: 30s
      timeout: 5s
      retries: 3

  app-producer:
    container_name: 'producer'
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8001:8001"

    command: ['echo','hello world, Frank']
    depends_on:
      db:
        condition: service_healthy

      rabbitmq:
        condition: service_healthy

      selenium:
        condition: service_healthy

    networks:
      - app-network


networks:
  app-network:
    driver: bridge

volumes:
  rabbitmq_data:
    driver: local

请添加图片描述

请添加图片描述

如果 依赖服务启动失败了, app-producer 就不会启动 ,直接退出了

请添加图片描述

参考文档

depends_on

分享快乐,留住感动. '2023-09-13 19:17:03' --frank

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1009985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32F407ZET6的环境温湿度监控系统(粤嵌GEC-M4)

注意使用事项&#xff1a; 开发板如下 由于外部晶振是8M&#xff0c;需要修改setup和stm32f4头文件的晶振值。 操作如下&#xff1a; system_stm32f4xx.c的254行 #define PLL_M 8stm32f4xx.h的127行 #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the Ex…

实战SRC漏洞挖掘全过程,流程详细【网络安全】

前言 记录一次完整的某SRC漏洞挖掘实战&#xff0c;为期一个多星期。文章有点长&#xff0c;请耐心看完&#xff0c;记录了完整的SRC漏洞挖掘实战 渗透过程 因为选择的幸运儿没有对测试范围进行规划&#xff0c;所以此次范围就是没有范围。 先上主域名看一眼&#xff0c;看…

2023 Google 开发者大会 – AI 领域的技术更新

大会介绍 Google 开发者大会是 Google 面向开发者和科技爱好者展示最新产品和平台的年度盛会。2023 Google 开发者大会 (Google I/O Connect | China) 为开发者提供丰富的学习资源&#xff0c;实践操作和现场演示&#xff0c;提供与谷歌专家互动、与其他开发者交流的契机&…

贝锐蒲公英客户端6.0发布,异地组网更快、更简单

贝锐蒲公英客户端6.0全新升级&#xff0c;新版本融合了企业版、个人版和个人管理端&#xff0c;不同身份用户可以统一登录&#xff0c;快速部署&#xff0c;即装即用&#xff0c;为异地组网带来更加简单、高效的解决方案。 快速部署、即装即用&#xff0c;支持不同身份用户统一…

langchain主要模块(三):Chain

langchain2之Chain langchain1.概念2.主要模块模型输入/输出 (Model I/O)数据连接 (Data connection)链式组装 (Chains)代理 (Agents)内存 (Memory)回调 (Callbacks) 3.链• LLMChain&#xff1a;• SimpleSequentialChain• Sequential Chains:• RouterChain&#xff1a; lan…

社群团购平台方的选品,无外乎就几个方面:

社群团购平台方选品&#xff0c;无外乎几个方面&#xff1a; 1、是个主推广爆品&#xff0c;好产品&#xff08;好产品的标准&#xff1a;有卖点&#xff1a;比如&#xff1a;有 品牌力、市场需求力、诱人的性价比等&#xff09; 2、你是否跟社群团购平台方说清楚这个产品的优…

什么是云存储,从对象存储说起?

在《存储系统形态之争,从块存储到统一存储》一文中我们提到了对象存储的概念,知道目前很多企业级存储都是支持对象存储的,比如EMC、NetApp和华为等。以EMC的对象存储为例,其最早在1998年就已经具备成熟的产品了,到目前已经有二十多年的历史了。如图是关于对象存储主要产品…

科研诚信与学术规范MOOC-错题集

为了确保学术和科研诚信&#xff0c;很多大学制定了荣誉法则。大学建立荣誉制度的初衷旨在预防大学生考试作弊。“反相对论公司”是对科学的不当干预。&#xff08;√&#xff09;科学具有普遍性&#xff0c;与种族、国籍、宗教、阶级和个人品质等个人因素无关。&#xff08;不…

GpsModule 350+ 常用GPS坐标地图

背景 开源库 GpsAndMap 的 GpsModule 模块中整理集成了 350 国内常用地市的GPS坐标地址&#xff0c;对于日常使用&#xff0c;例如打些标记&#xff0c;做些PPT展示&#xff0c;是非常方便的。 引入模块 pip install GpsAndMap 打印常用地市GPS地名清单 以下代码打印了常用…

【业务功能109】微服务-springcloud-springboot-Skywalking-链路追踪-监控

Skywalking skywalking是一个apm系统&#xff0c;包含监控&#xff0c;追踪&#xff0c;并拥有故障诊断能力的 分布式系统 一、Skywalking介绍 1.什么是SkyWalking Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品&#xff0c;它同时吸收了Zipkin /Pinpoint …

力扣 -- 1218. 最长定差子序列

参考代码&#xff1a; class Solution { public:int longestSubsequence(vector<int>& arr, int difference) {int narr.size();unordered_map<int,int> hash;//nums[i]绑定dp[i]hash[arr[0]]1;int ret1;for(int i1;i<n;i){int aarr[i];int ba-difference;…

电力系统安全问题,金融行业需警惕!

在现代金融业务的快速发展中&#xff0c;电力供应的可靠性变得愈发重要。金融交易和数据处理依赖于持续的电力供应&#xff0c;任何电力中断都可能导致严重的业务中断和损失。 为了应对这一挑战&#xff0c;金融机构广泛采用了不间断电源&#xff08;UPS&#xff09;系统&#…

QT 连接SQLServer数据库

1、安装SQLServer数据库后 在SQL Server 配置管理器中 设置后&#xff0c;需要重新启动SQL Server服务 2、重点* 配置ODBC数据源 由于没有配置ODBC&#xff0c;一直无法连接 开始——ODBC数据源管理程序(64位) 之后选择&#xff1a;使用用户输入登录ID和密码的SQL Server验…

Improving 3D Imaging with Pre-Trained Perpendicular 2D Diffusion Models

使用预先训练的垂直 2D 扩散模型改进 3D 成像 论文链接&#xff1a;https://arxiv.org/abs/2303.08440 项目链接&#xff1a;https://github.com/hyn2028/tpdm Abstract 扩散模型由于其众多的优点已经成为一种流行的图像生成和重建方法。然而&#xff0c;大多数基于扩散的逆…

只有68g的电竞鼠标,软硬件都能自定义,雷柏VT9Pro上手

最近雷柏的轻量化无线鼠标又出了一款新品VT9PRO&#xff0c;这款鼠标相比于之前的VT9升级不少&#xff0c;不仅机身更轻盈&#xff0c;而且配置更高&#xff0c;采用了原相定制3398光学引擎&#xff08;3395高定版&#xff09;&#xff0c;外加欧姆龙5000万次轻脆微动等专业级配…

Jmeter安装与测试

目录 一&#xff1a;JMeter简介&#xff1a; 二&#xff1a;JMeter安装与配置 三&#xff1a;JMeter主要原件 一&#xff1a;JMeter简介&#xff1a; JMeter&#xff0c;一个100&#xff05;的纯Java桌面应用&#xff0c;由Apache组织的开放源代码项目&#xff0c;它是功能 …

链式法则:概率论描述语言模型

目录 1.事件相互独立 2.链式法则 3.示例 4.语言模型中的链式法则 1.事件相互独立 事件相互独立就是&#xff1a;一个事件的发生与否&#xff0c;不会影响另外一个事件的发生。 当a和b两个事件互相独立时&#xff0c;有&#xff1a; P(a | b) P(a) 推广到3个事件就有下面…

windows2003 IIS6.0解析漏洞

一、漏洞说明 &#xff08;1&#xff09;当建立*.asa、.asp格式的文件夹时&#xff0c;其目录下的任意文件都将被IIS当做asp文件解析。 &#xff08;2&#xff09;当文件.asp&#xff1a;1.jpg IIS6.0同样会将文件当做asp文件解析。 二、搭建环境 Windows server2003安装iis6.0…

内网隧道代理技术(二十五)之 ICMP隧道反弹SHELL

ICMP隧道反弹SHELL ICMP隧道原理 由于ICMP报文自身可以携带数据,而且ICMP报文是由系统内核处理的,不占用任何端口,因此具有很高的隐蔽性。把数据隐藏在ICMP数据包包头的data字段中,建立隐蔽通道,可以实现绕过防火墙和入侵检测系统的阻拦。 ICMP隧道有以下的优点: ICMP…

Mybatis sql参数自动填充

问题描述 在日常开发中&#xff0c;经常会遇到Mybatis sql语句的操作问题&#xff0c;由于Mybatis实现sql的动态拼接&#xff0c;开发过程中&#xff0c;为了验证sql是否书写正确&#xff0c;通常需要获取的控制台打印的sql语句来检查是否拼接正确。如下图所示&#xff1a; 那…