我有这样的Dockerfile:
FROM alpine:3.7
COPY confluent-5.3.0 confluent-5.3.0
COPY startup.sh startup.sh
COPY start-connector.sh start-connector.sh
RUN chmod +x startup.sh
RUN chmod +x start-connector.sh
RUN chmod +x confluent-5.3.0/bin/connect-standalone
EXPOSE 8083:8083
RUN apk --no-cache add curl
ENTRYPOINT ["./startup.sh"]
入口点运行我的启动脚本(当我在Linux上运行时,它可以按预期工作),但是,当我运行映像时,出现以下错误:
./root/start-connector.sh: line 3: ./root/confluent-5.3.0/bin/connect-standalone: Permission denied
因此,我通过将以下内容添加到Dockerfile中来使该脚本可执行:
RUN chmod +x confluent-5.3.0/bin/kafka-run-class
重建并运行后,现在出现此错误:
./confluent-5.3.0/bin/connect-standalone: exec: line 75: ./confluent-5.3.0/bin/kafka-run-class: not found
因此该文件存在并且可以执行,但是在将嵌套文件夹结构复制到映像后,一些嵌套脚本被破坏了。我已经检查了容器并确认所有文件都已正确复制。请注意,connect-standalone和kafka-run-class都在同一目录中。
上面的代码段中失败的特定行在这里:
echo "$(dirname $0)"
exec $(dirname $0)/kafka-run-class
dirname输出./confluent-5.3.0/bin
所以tl; dr我的脚本在Linux上运行时有效。但是在创建了Docker映像之后,我未编写的脚本中的某些指针似乎不匹配。在仔细检查了文件结构并回显了变量之后,一切似乎都已正确设置,而且我无法弄清楚嵌套脚本之间为什么找不到彼此。
答案 0 :(得分:0)
因此嵌套脚本正在运行bash,而bash尚未预先安装在Alpine上。如果有人遇到此问题,只需将bash添加到您的Dockerfile中:
RUN apk --no-cache add bash
或使用Alpine以外的其他东西。