我有以下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
3条答案
按热度按时间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
zz2j4svz2#
你可以用一个合成文件版本2.1来做,但是它在合成文件版本3中被删除了。
使用depends_on时需要注意以下几点:
但是,会建议您不要降级撰写文件。而是用 Package 器脚本适当地处理它。
您可能会发现wait-for-it、dockerize和/或wait-for很方便。
在编写版本3中,可以使用depends long语法指定条件
condition
:认为满足依赖性的条件service_started
:是上述短语法的等效语法service_healthy
:指定在启动依赖服务之前,依赖项预期是“健康的”(如healthcheck所指示的)。service_completed_successfully
:指定在启动依赖服务之前,期望依赖运行到成功完成。例如
yv5phkfx3#
Edit:这只解决了YAML错误,但仍然不能产生一个工作的docker-compose,因为depends_on在Compose version 3中无效。您需要Compose版本2.1或Compose Specification。
你缺少一个
-
来使depends_on
成为一个数组:注意
app
之前的-
。如果没有它,services.app-test.depends_on
将是一个对象,而不是一个数组。还要注意空格的数量:如果condition
与app
在同一列中,您也会得到不希望的结果。在对YAML进行解码时,您将得到以下内容(JSON格式):
添加
-
: