You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行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..."
# ...后续脚本内容

验证步骤

  1. 应用修改后,重新构建并启动容器:
docker compose -f docker-compose.dev.yml up --build
  1. 查看kafka-topics-creator容器日志,确认脚本正常执行并创建目标Topic。

内容的提问来源于stack exchange,提问作者Doolan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:19:47