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

Docker容器中通过crontab运行Shell脚本异常问题求助

Docker容器中Crontab执行Shell脚本异常的解决方法

问题现象

  • Crontab每分钟执行touch /abc.txt成功,但生成的文件名为abc.txt$'\r'(带Windows换行符残留)
  • 自定义脚本myscript.sh未执行,找不到/test.txt和/test2.txt
  • /var/log/cron.log为空
  • 手动运行myscript.sh完全正常,更换基础镜像问题依旧

问题根源

Windows系统默认使用CRLF(\r\n)作为换行符,而Linux系统使用LF(\n)。在Windows环境下编写的crontab和myscript.sh文件被复制到Docker容器后,残留的\r字符会导致:

  • Crontab解析命令时,把/abc.txt识别成/abc.txt\r,生成带\r的文件名
  • 执行myscript.sh时,脚本首行#!/bin/bash\r会被解析为找不到/bin/bash\r这个命令,直接导致脚本执行失败
  • Cron默认不会输出日志到/var/log/cron.log,需要额外配置

解决步骤

1. 转换文件换行符为LF

在本地编辑器(如VS Code)中,将crontab和myscript.sh的换行符设置为LF:

  • VS Code右下角点击CRLF,切换为LF
  • 保存文件后重新构建镜像

2. 在Dockerfile中添加换行符转换步骤

如果无法确保本地文件格式,可在Docker构建过程中用dos2unix命令转换:

FROM ubuntu:latest

RUN apt-get update && apt-get -y install cron nano dos2unix

RUN mkdir -p /custom/bin

COPY ./myscript.sh /custom/bin/myscript.sh
RUN chmod +x /custom/bin/myscript.sh && dos2unix /custom/bin/myscript.sh

COPY ./dockerconfigs/crontab /etc/cron.d/crontab
RUN chmod 0644 /etc/cron.d/crontab && dos2unix /etc/cron.d/crontab

RUN crontab /etc/cron.d/crontab
 
RUN touch /var/log/cron.log
# 配置cron输出日志到指定文件
RUN echo "cron.* /var/log/cron.log" >> /etc/rsyslog.d/cron.conf

CMD service rsyslog start && cron && tail -f /var/log/cron.log

3. 验证修复效果

构建并运行容器后:

  • 检查根目录下是否生成test.txt、test2.txt和abc.txt(无\r后缀)
  • 查看/var/log/cron.log,应该能看到cron执行脚本的日志记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:02:46