Docker编写:depends_on with condition -> invalid type,应该是数组

qoefvg9y  于 2023-05-22  发布在  Docker
关注(0)|答案(3)|浏览(426)

我有以下compose文件:

version: "3"

services:

  zookeeper:
    image: docker-dev.art.intern/wurstmeister/zookeeper:latest
    ports:
      - 2181:2181

  kafka:
    image: docker-dev.art.intern/wurstmeister/kafka:latest
    ports:
      - 9092:9092
    environment:
      - KAFKA_LISTENERS=PLAINTEXT://:9092
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092
      - KAFKA_ADVERTISED_HOST_NAME=kafka
      - KAFKA_ADVERTISED_PORT=9092
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
    depends_on:
      - zookeeper

  app:
    build:
      context: ./
      dockerfile: app/Dockerfile
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:4020/actuator/health"]
      interval: 30s
      timeout: 10s
      retries: 5
    depends_on:
      - kafka
      - zookeeper

  app-test:
    build:
      context: ./
      dockerfile: test/Dockerfile
    depends_on:
      app:
        condition: service_healthy

正如你所看到的,我为应用程序实现了一个健康检查,我使用了service_healthy条件。但这会导致错误:

The Compose file '.\docker-compose.yml' is invalid because:
services.app-test.depends_on contains an invalid type, it should be an array

有办法解决这个问题吗?
如果我将数组改为sanytax:

...

  app-test:
    build:
      context: ./
      dockerfile: test/Dockerfile
    depends_on:
      - app:
          condition: service_healthy

错误更改为:

The Compose file '.\docker-compose.yml' is invalid because:
services.app-test.depends_on contains an invalid type, it should be a string
ev7lccsx

ev7lccsx1#

这似乎在Docker compose规范的版本3中被删除,但随后在版本3.9中重新引入。
参见https://github.com/compose-spec/compose-spec/blob/master/spec.md#long-syntax-1
请注意,这似乎需要Compose V2,它在最新的docker二进制文件上作为docker compose执行。
参见https://docs.docker.com/compose/#compose-v2-and-the-new-docker-compose-command

zz2j4svz

zz2j4svz2#

你可以用一个合成文件版本2.1来做,但是它在合成文件版本3中被删除了。
使用depends_on时需要注意以下几点:

  • depends_on在启动web之前不会等待db和redis“准备好”--只有在它们已经启动之前。如果您需要等待服务准备就绪,请参阅控制启动顺序以了解有关此问题的更多信息以及解决此问题的策略。

但是,会建议您不要降级撰写文件。而是用 Package 器脚本适当地处理它。
您可能会发现wait-for-itdockerize和/或wait-for很方便。
在编写版本3中,可以使用depends long语法指定条件
condition:认为满足依赖性的条件

  • service_started:是上述短语法的等效语法
  • service_healthy:指定在启动依赖服务之前,依赖项预期是“健康的”(如healthcheck所指示的)。
  • service_completed_successfully:指定在启动依赖服务之前,期望依赖运行到成功完成。

例如

services:
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
  redis:
    image: redis
  db:
    image: postgres
yv5phkfx

yv5phkfx3#

Edit:这只解决了YAML错误,但仍然不能产生一个工作的docker-compose,因为depends_on在Compose version 3中无效。您需要Compose版本2.1或Compose Specification

你缺少一个-来使depends_on成为一个数组:

app-test:
    build:
      context: ./
      dockerfile: test/Dockerfile
    depends_on:
      - app:
          condition: service_healthy

注意app之前的-。如果没有它,services.app-test.depends_on将是一个对象,而不是一个数组。还要注意空格的数量:如果conditionapp在同一列中,您也会得到不希望的结果。
在对YAML进行解码时,您将得到以下内容(JSON格式):

{
  "app-test": {
    "build": {
      "context": "./",
      "dockerfile": "test/Dockerfile"
    },
    "depends_on": {
      "app": {
        "condition": "service_healthy"
      }
    }
  }
}

添加-

{
  "app-test": {
    "build": {
      "context": "./",
      "dockerfile": "test/Dockerfile"
    },
    "depends_on": [
      {
        "app": {
          "condition": "service_healthy"
        }
      }
    ]
  }
}

相关问题