docker - Alpine 3.18 Docker 镜像在使用 & 运行后台命令后不遵守 `sleep` shell 命令

标签 docker shell sh alpine-linux

我一直在使用一个简单的脚本,其中包含一个 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/

相关文章:

unix - 注释掉 shell 脚本中的一组行

xml - 如何验证 xml 文件在 sh 或 bash 中是否有效?

python - Fluentd 发布到标准输出但不发布到 Elasticsearch

mysql - 无法在EC2上同时运行Jenkins和MySQL的Docker容器

shell 脚本 : Remove hello world docker container without knowing ID

c - 如何在 C 中使用 pstree 显示子进程

c - 如何为 SIGCHLD 制作一个信号处理程序,它将在 shell 中获取后台进程?

bash - 为什么在docker-machine VM中创建文件会导致权限被拒绝?

shell - Mac OSx 终端 : "not a valid identifier" on function definition

docker - "Kind"写入节点创建集群失败