强制Go Docker容器等待Cassandra容器

118 阅读1分钟

假设你有两个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