运行Docker时Shell脚本权限被拒,Kafka本地启动失败
解决Docker中Kafka初始化脚本权限拒绝问题
问题重现
执行docker compose -f docker-compose.dev.yml up时,kafka-topics-creator容器触发权限拒绝错误:
Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "./create-kafka-topic.sh": permission denied: unknown
核心解决办法
1. 确保Docker构建时正确设置脚本执行权限
你的Dockerfile中虽添加了RUN chmod 777 create-kafka-topic.sh,但可能因构建缓存导致该步骤未实际生效,可通过两种方式修复:
方式一:强制刷新构建缓存
执行构建时跳过缓存,确保权限设置命令执行:
docker compose -f docker-compose.dev.yml build --no-cache kafka-topics-creator
方式二:优化Dockerfile逻辑
修改Dockerfile.init-kafka.yml,直接在COPY阶段设置执行权限,并使用绝对路径执行脚本避免路径问题:
FROM confluentinc/cp-kafka WORKDIR /usr/bin # 复制脚本时直接赋予执行权限 COPY --chmod=755 scripts/create-kafka-topics.sh create-kafka-topic.sh # 使用绝对路径执行脚本,规避WORKDIR潜在的路径识别问题 ENTRYPOINT ["/usr/bin/create-kafka-topic.sh"]
2. 修复Windows环境下的脚本换行符问题
若create-kafka-topics.sh是在Windows系统创建的,换行符会是CRLF格式,而Linux容器仅识别LF格式,这会伪装成权限拒绝错误。解决方式:
- 使用Git Bash或WSL执行命令转换换行符:
sed -i 's/\r$//' scripts/create-kafka-topics.sh - 或在VS Code等IDE中,将文件右下角的换行符格式切换为
LF
3. 额外优化:等待Kafka服务就绪后执行脚本
当前depends_on仅保证Kafka容器启动,不保证服务就绪,脚本可能因连接失败报错。可在脚本开头添加等待逻辑:
#!/bin/bash # 等待Kafka服务就绪 until kafka-topics --bootstrap-server kafka:9092 --list &>/dev/null; do echo "Waiting for Kafka to be ready..." sleep 2 done # 原脚本内容 KAFKA_TOPICS=("dev.event.this.is.my.kafka.event") kafka-topics --bootstrap-server kafka:9092 --list echo "Start creating default topics..." # ...后续脚本内容
验证步骤
- 应用修改后,重新构建并启动容器:
docker compose -f docker-compose.dev.yml up --build
- 查看kafka-topics-creator容器日志,确认脚本正常执行并创建目标Topic。
内容的提问来源于stack exchange,提问作者Doolan
相关产品推荐
相关产品推荐

