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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:17:12