假设你有两个docker服务/容器。一个必须准备好接受来自另一个的连接。正如你刚才注意到的,我没有说 "一个必须运行",因为 "准备接受连接 "和 "运行 "之间是有区别的。docker compose的depends_on 关键并不总是能解决问题,因为它只是检查容器是否正在运行。如果一个服务依赖于Cassandra、MySQL、RabbitMQ、Elasticsearch等服务,往往会出现这种情况。它们需要时间来接受连接。为了解决这个问题,我们可以使用一个额外的脚本。这个脚本将定期ping这些服务,直到它们准备好接受连接,然后再实际运行主服务。
在这个例子中,我们有一个Go和Cassandra服务。Go依赖于Cassandra。Cassandra接受连接的速度很慢。我们将在Go中使用我们的脚本,强迫它首先等待Cassandra接受连接。一旦Cassandra说它准备好了,我们就会启动Go服务。
结构
├── cassandra
文件
cassandra.go
package cassandra
main.go
package main
docker-compose.yaml
version: "3.7"
Dockerfile (cassandra)
FROM cassandra:3.11.9
init.sh (cassandra)
#!/bin/bash
keyspace.cql (cassandra)
DROP KEYSPACE IF EXISTS tetris;
Dockerfile (go)
FROM golang:1.15-alpine3.12 as build
init.sh (go)
#!/bin/sh
测试
$ docker-compose -f docker/docker-compose.yaml up