如何在docker compose启动Couchbase后正确执行schema脚本
解决方案
核心问题是你当前的配置直接替换了Couchbase镜像的默认启动命令,不仅没有启动Couchbase服务,还直接执行初始化脚本,自然会失败。正确的编排方式如下:
1. 拆分服务,新增独立的初始化服务
将Couchbase服务本身和初始化脚本拆分为两个独立服务,避免覆盖Couchbase的默认启动逻辑。
2. 给Couchbase服务添加健康检查
通过健康检查确认Couchbase完全启动就绪后,再执行初始化脚本。
3. 修改后的docker-compose.yml配置
version: '3.8' # 建议使用3.8及以上版本,支持depends_on的condition参数 services: couchbase: image: couchbase:community-6.0.0 deploy: replicas: 1 ports: - 8091:8091 - 8092:8092 - 8093:8093 - 8094:8094 - 11210:11210 volumes: - ./:/data container_name: couchbase # 新增健康检查,判断服务是否完全启动 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8091/ui/index.html"] interval: 5s timeout: 3s retries: 20 start_period: 10s # 给Couchbase预留初始启动时间 couchbase-init: image: couchbase:community-6.0.0 # 复用相同镜像,自带couchbase-cli等操作工具 volumes: - ./:/data depends_on: couchbase: condition: service_healthy # 等couchbase服务健康后再启动初始化任务 # 执行初始化脚本,脚本内Couchbase地址直接填服务名couchbase即可,容器网络内可直接解析 command: /bin/bash -c "/data/cb-create.sh" volumes: kafka-data:
4. 初始化脚本补充优化
建议在cb-create.sh开头添加简单的重试逻辑,进一步避免偶发的服务未就绪问题:
#!/bin/bash # 等待Couchbase接口就绪 until curl -s http://couchbase:8091 > /dev/null; do echo "等待Couchbase服务启动..." sleep 2 done # 后续接你原有schema初始化逻辑
内容的提问来源于stack exchange,提问作者Sankalp
相关产品推荐
相关产品推荐

