Docker 睡眠命令有什么作用?

What does the Docker sleep command do?

我找不到关于 Docker sleep 命令的作用的明确解释,有人可以解释一下吗?例如:

docker container run -d alpine sleep 1d

我在网上看过,但找不到简单的解释。

docker container run -d --name mycontainer myimage:mytag sleep infinity

镜像名称后的最后一部分(即sleep infinity)不是docker命令,而是发送到容器以覆盖其默认命令(在Dockerfile中设置)的命令).

文档摘录(您可以在终端中输入 man sleep,它可能因实施而异)

Pause for NUMBER seconds. SUFFIX may be 's' for seconds (the default), 'm' for minutes, 'h' for hours or 'd' for days

令我惊讶的是,参数 infinity 没有记录在我的实现中,但仍然被接受。这很容易理解:它会无限期地暂停(即直到命令为 stopped/killed)。在您上面的示例中,它将暂停一天。

使用 sleep 作为 运行 一个 docker 容器的命令的通常原因是什么?

A docker 容器将一直存在,直到它 运行s 完成命令。此命令通常在用于构建映像的 Dockerfile 中设置(在 CMD 节中),并且可以在命令行上覆盖(如上例所示)。

许多基本映像(如 debian 的基本 OS、ubuntu、centos...)将 运行 和 shell 作为默认命令(通常 bashsh)。如果您尝试使用其默认命令从该图像生成一个容器,它将一直存在到 shell 退出。

当 运行 交互式地使用这样的图像时(即使用 docker container run -it .....),它将 运行 直到您结束 shell 会话。但是如果你想在后台启动它(即使用 docker container run -d ...)它会立即退出,留下一个停止的容器。

在这种情况下,您可以通过用一个长 运行ning 命令覆盖默认命令来“伪造”一个长 运行ning 服务,该命令基本上什么都不做,只等待容器停止。两个广泛使用的命令是 sleep infinity(或任何适合您需要的时间段)和 tail -f /dev/null

像这样启动容器后,您可以使用它来测试您需要的任何内容。最常见的方法是 运行 一个交互式 shell 反对它:

# command will depend on shells available in your image
docker exec -it mycontainer [bash|sh|zsh|ash|...]

完成 experimentation/test 后,您可以停止并回收容器

docker container stop mycontainer
docker container rm mycontainer