Alpine 3.18 Docker镜像在使用&运行后台命令后不尊重`sleep` shell命令

cclgggtu  于 2023-08-07  发布在  Shell
关注(0)|答案(1)|浏览(180)

我一直在使用一个简单的脚本,其中有一个while循环作为Docker容器的入口点,每分钟运行一个命令。一种简单的cronjob可以这么说。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秒钟。
在Python 3.18和/或BusyBox中,shell脚本的语法有什么变化吗?需要注意的是,该脚本有相同的问题,无论是像docker run示例那样的一行代码,还是像上面的示例那样格式化的.sh文件。

yrefmtwq

yrefmtwq1#

这是busybox ash中的一个bug,已经在上游修复了,但还没有包含在发行版中(在撰写本文时,v1.36.1是最新的版本)。
修复包含在提交7362d2979434c565ae70b0ccf9d4b09d7597fb48中;因此,当新的BusyBox发行版下一次可用时,您可以预期该行为不再发生。
正如Grobo所建议的,你可以在过渡期间切换到dash:这个bug与busybox尝试调用自己的sleep有关。

相关问题