alpine:3.12容器脚本自动运行失败,手动执行正常的问题排查
问题分析与解决
核心原因
脚本的换行符格式是Windows的CRLF(\r\n),而Alpine容器里的sh(即Ash)对换行符非常敏感,会把每行末尾的\r当成命令的一部分,导致while循环的语法解析错误——Ash无法正确识别do的位置,最终报错"unexpected 'done' (expecting 'do')"。
手动执行时正常,是因为你进入Pod后大概率用的是bash(你在Dockerfile里安装了bash),而bash对CRLF格式的换行符兼容性更好,能自动忽略\r。
解决方法
方法1:转换脚本为Unix换行符(LF)
在本地将脚本文件的换行符改为Unix格式(\n):
- 用文本编辑器(比如VS Code)打开脚本,右下角切换换行符为
LF后保存。 - 或者用命令行工具转换:
dos2unix 1#check_dmesg_logs.sh
方法2:在Dockerfile中添加换行符修复步骤
如果无法修改本地脚本格式,可在Dockerfile里添加一行,自动修复容器内脚本的换行符:
FROM alpine:3.12 RUN apk add --no-cache util-linux python3 py3-pip RUN apk add --no-cache --upgrade bash COPY 1#check_dmesg_logs.sh /usr/local/bin/check-dmesg-logs.sh # 添加这行修复换行符 RUN sed -i 's/\r$//' /usr/local/bin/check-dmesg-logs.sh RUN chmod +x /usr/local/bin/check-dmesg-logs.sh CMD ["sh", "/usr/local/bin/check-dmesg-logs.sh"]
方法3:改用bash执行脚本
既然已经安装了bash,直接用bash运行脚本,避开Ash对换行符的严格限制:
- 修改Dockerfile的CMD:
CMD ["bash", "/usr/local/bin/check-dmesg-logs.sh"] - 或者修改脚本的shebang为
#!/bin/bash,然后让脚本直接执行:CMD ["/usr/local/bin/check-dmesg-logs.sh"]
内容的提问来源于stack exchange,提问作者Sourav Karmakar
相关产品推荐
相关产品推荐

