Spring-boot - Docker Compose - 服务就绪
Posted
技术标签:
【中文标题】Spring-boot - Docker Compose - 服务就绪【英文标题】:Spring-boot - Docker Compose - Service ready 【发布时间】:2021-05-14 04:33:25 【问题描述】:我有一个包含 3 个服务的 docker-compose:config-server、cpo-events 和 cpo-executor。我希望服务仅在 config-server 准备好时启动,因为服务需要 config-server 服务中的配置文件。
docker-compose.yml:
version: '3.7'
services:
config-server:
container_name: cup-config-server
image: cup-config-server:1.0.0
expose:
- 8888
ports:
- 8888:8888
networks:
- spring-cloud-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8888/cpo-executor/dev"]
interval: 30s
timeout: 10s
retries: 5
cpo-events:
container_name: cpo-events-kafka
image: cpo-events-kafka:1.0.0
expose:
- 8878
ports:
- 8878:8878
networks:
- spring-cloud-network
depends_on:
- config-server
links:
- config-server
cpo-executor:
container_name: cpo-executor
image: cpo-executor:1.0.0
expose:
- 8879
ports:
- 8879:8879
networks:
- spring-cloud-network
depends_on:
- config-server
links:
- config-server
networks:
spring-cloud-network:
driver: bridge
Depends_on、links、healthcheck,没有什么能保证这两个服务(cpo-executor、cpo-event)只有在 config-server 准备好之后才能启动。
【问题讨论】:
您阅读了吗:docs.docker.com/compose/startup-order 是的,但我不知道如何使用 spring-cloud-config-server 来实现。你知道吗? 您可以使用等待它并调用配置服务器的休息服务,或者如果有执行器端点 【参考方案1】:如果你在本地测试服务,那么你可以添加一个入口点脚本
#!/usr/bin/env bash
wait_single_host()
local host=$1
shift
local port=$1
shift
echo "==> Check host $host:$port"
while ! nc $host $port > /dev/null 2>&1 < /dev/null; do echo " --> Waiting for $host:$port" && sleep 1; done;
wait_all_hosts()
if [ ! -z "$WAIT_FOR_HOSTS" ]; then
local separator=':'
for _HOST in $WAIT_FOR_HOSTS ; do
IFS="$separator" read -ra _HOST_PARTS <<< "$_HOST"
wait_single_host "$_HOST_PARTS[0]" "$_HOST_PARTS[1]"
done
else
echo "IMPORTANT : Waiting for nothing because no $WAIT_FOR_HOSTS env var defined !!!"
fi
wait_all_hosts
sleep 60
bash -c "/usr/local/bin/docker-entrypoint $*"
您可以查看完整的示例用法here。它解决了相同的问题,但针对 docker-compose 3.7 版的不同用例
【讨论】:
就我而言,我没有 Dockerfile,因为我使用 maven 插件来生成这些支持 buildpacks 的图像 :(. 你总是可以创建一个 docker 文件。如果它仅用于测试目的,那么您可以添加两行FROM your-image-name
和 Entrypoint
link。它应该工作:)以上是关于Spring-boot - Docker Compose - 服务就绪的主要内容,如果未能解决你的问题,请参考以下文章