Docker Compose中service_completed_successfully致Cassandra容器退出码2
问题分析与解决思路
现象汇总
- Docker Compose里给
dd_dew容器配置依赖cassandra_populator,并使用condition: service_completed_successfully条件时,cassandra_populator会以状态码2退出 - 删掉这个依赖条件后,
cassandra_populator能正常以状态码0退出 cassandra_populator通过Dockerfile执行cassandra-setup.sh脚本,脚本用cqlsh连接dd_cassandra容器执行schema.cql做数据初始化,日志显示Cassandra完成数据截断操作后,容器立刻以状态码2退出
调试过程
- 在脚本的
cqlsh dd_cassandra -f "${WORKSPACE}/schema.cql"命令后加echo "AFTER cqlsh",容器就能正常返回状态码0;删掉这个echo语句,状态码2的问题又出现 - 注释掉脚本里合并
schema.cql和alter.cql的两行代码后,脚本执行成功,状态码正常
根因定位
合并后的schema.cql和alter.cql里存在Cassandra语句异常(比如语法错误、操作不存在的资源、权限问题等),导致cqlsh命令返回非0状态码。因为脚本默认会以最后一条命令的状态码作为整体退出码,当后续没有其他命令时,脚本就继承了cqlsh的错误码2;而添加echo命令后,echo执行成功返回的状态码0覆盖了之前的错误码,所以脚本整体返回0。
解决建议
- 逐行检查
schema.cql和alter.cql里的CQL语句,重点排查数据截断操作之后的内容,确认是否存在语法错误、无效的键空间/表操作、权限不足等问题 - 在
cqlsh命令后添加错误捕获逻辑,避免后续命令掩盖真实问题,示例:cqlsh dd_cassandra -f "${WORKSPACE}/schema.cql" if [ $? -ne 0 ]; then echo "CQL脚本执行失败" exit 1 fi - 不要用
echo这类无关命令掩盖脚本的真实执行状态,确保每一步操作的错误都能被及时发现和处理
内容的提问来源于stack exchange,提问作者asn
相关产品推荐
相关产品推荐

