我一直在使用一个简单的脚本,其中包含一个 while 循环作为 Docker 容器的入口点,每分钟运行一个命令。可以说是一种简单的定时任务。 while 循环如下所示:
#!/bin/sh
while [ true ]
do
php script.php &
sleep 60
done
这一直工作正常,直到我更新了基于 Alpine 3.18 构建的基础镜像,它现在不再遵循 sleep 60
命令,而是立即重新运行 php 脚本。
您可以通过分别使用 Alpine 3.17 和 3.18 版本在本地运行以下简单的 docker 来测试这一点:
docker run --rm -it alpine:3.17 sh -c "while [ true ]; do echo 1 & sleep 3; done;"
正确运行并在回显 1
之间等待 3 秒。
docker run --rm -it alpine:3.18 sh -c "while [ true ]; do echo 1 & sleep 3; done;"
刚刚开始将 1
流式传输到屏幕,不休眠 3 秒。
3.18 和/或 BusyBox 中 shell 脚本的语法是否发生了变化?需要注意的是,无论是像 docker run
示例这样的单行脚本,还是像上面示例那样格式化的它自己的 .sh
文件,该脚本都存在相同的问题。
最佳答案
这是 busybox ash 中的一个错误,已在上游修复,但未包含在版本中(截至撰写本文时,v1.36.1 是最新版本)。
该修复包含在提交 7362d2979434c565ae70b0ccf9d4b09d7597fb48 中;因此,当下一个新的 busybox 版本可用时,您可以预期这种行为将不再发生。
如suggested by Grobu ,您可以在此期间切换到 dash:此错误与 busybox 尝试调用自己的 sleep
有关。
关于docker - Alpine 3.18 Docker 镜像在使用 & 运行后台命令后不遵守 `sleep` shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76687757/