Exited (127): sleep 3600; do :; done: command not found【docker desktop】

329 阅读2分钟

问题

基于 wsl的docker,在启动镜像 databricksdocs/pytest 的时候,出现: 2023-08-26 08:20:51 /bin/bash: line 1: sleep 3600; do :; done: command not found

原因

错误提示表明,Docker在尝试运行/bin/bash: line 1: sleep 3600; do :; done这条命令时遭遇了问题。这条命令看起来似乎是个无限循环,但其实有些部分写错了。

正确的无限循环应该是这样的:

while true; do sleep 3600; done

或者简单点:

sleep infinity

解决

Dockerfile

  1. 如果你是在Dockerfile里使用CMD或ENTRYPOINT指定的命令,确保修正为:
CMD ["bash", "-c", "while true; do sleep 3600; done"]

或者

CMD ["sleep", "infinity"]

docker run

  1. 如果你是通过docker run来指定命令的,确保修正为:
docker run <your-image-name> bash -c "while true; do sleep 3600; done"

或者

docker run <your-image-name> sleep infinity

修正后再尝试启动容器应该就没问题了。

后记

Docker 的 inspect 命令为提供了关于容器的详细信息。这些信息以 JSON 格式呈现,并涵盖了容器的各个方面。以下是一部分输出内容的解释:

  1. Id:

    • 这是容器的唯一标识符。你可以使用这个ID来引用或管理容器。
  2. Created:

    • 这是容器创建的时间。
  3. Path:

    • 当容器启动时要运行的主命令(通常是在 Dockerfile 中通过 CMD 或 ENTRYPOINT 指定的命令)。
  4. Args:

    • 与主命令(Path)关联的参数列表。在这里,它是尝试运行 bash 命令并接受 -c 作为参数,后面跟着 'sleep 3600; do :; done',这显然是个语法错误。
  5. State:

    • 这部分提供了容器的当前状态信息:
      • Status: 容器的状态,如 "running"、"exited" 等。
      • Running: 布尔值,指示容器是否正在运行。
      • Paused: 布尔值,指示容器是否已暂停。
      • Restarting: 布尔值,指示容器是否正在重新启动。
      • OOMKilled: 布尔值,表示容器是否因为内存不足而被杀死。
      • Dead: 布尔值,表示容器是否死掉。
      • Pid: 容器的进程 ID。如果容器没有运行,此值为0。
      • ExitCode: 容器退出时的代码。正常退出为0,否则表示出现错误。在你的情况下,它是127,这通常意味着命令没有找到。
      • Error: 如果在容器内部有错误发生,这里会显示相关的错误信息。
      • StartedAt: 容器最后一次启动的时间。
      • FinishedAt: 容器最后一次停止的时间。

inspect 中,我们可以看到容器尝试运行一个语法错误的命令,因此它已经退出,返回了错误代码127。