Databricks通过CI/CD上传至DBFS的init脚本偶发不生效问题咨询
问题根因
这是换行符格式不兼容导致的,具体原理如下:
- 你本地/CI/CD运行环境生成的bash脚本使用的是Windows风格换行符(CRLF,即
\r\n),而Databricks集群底层是Linux操作系统,仅默认识别Unix风格换行符(LF,即\n) - 报错信息里
update-ca-certificates和后面的: command not found分成两行,就是因为命令末尾携带了不可见的\r控制字符,bash会把update-ca-certificates\r整体识别为命令名,自然找不到对应可执行文件 - 普通
cat命令不会打印\r这类不可见控制字符,所以你肉眼对比两个脚本会觉得内容完全一致
验证方法
执行以下命令即可看到不可见字符,确认换行符格式问题:
cat -A /dbfs/databricks/init-scripts/custom-cert.sh
若输出的每行末尾都带有
^M$,则说明是CRLF格式的错误换行;正常Linux可执行脚本的行尾仅显示$
修复方案
任选其一即可:
- 本地编辑脚本时,直接将编辑器的换行符格式设置为
Unix(LF)后再保存,主流代码编辑器(VSCode、Notepad++、JetBrains系列等)均支持该配置 - 在CI/CD流水线的上传步骤前,增加转换换行符的处理,用
dos2unix工具格式化脚本:
# 先安装dos2unix(根据CI环境的包管理器调整安装命令) apt install -y dos2unix # 转换脚本换行格式 dos2unix custom-cert.sh # 后续执行原有的上传DBFS逻辑
- 若不方便修改CI流程和本地编辑配置,可直接在脚本首行后新增忽略回车符的配置:
#!/bin/bash set -o igncr # 后续原有脚本内容保持不变 cp /dbfs/orgcertificates/orgcerts.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates echo "export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt" >> /databricks/spark/conf/spark-env.sh
内容的提问来源于stack exchange,提问作者Saugat Mukherjee
相关产品推荐
相关产品推荐

