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
相关产品推荐
相关产品推荐

