如何限制docker run执行时间?

Bri*_*ian 2 docker

我想在docker容器中运行命令。如果该命令花费了3秒钟以上的时间,则应删除该容器。

我以为可以通过使用中的--stop-timeoutoption 来实现此目标docker run

但是我的命令似乎出了点问题。

例如,docker run -d --stop-timeout 3 ubuntu:14.04 sleep 100命令创建一个持续3秒以上的Docker容器。第三秒后,容器不会停止或删除。

我是否误解了--stop-timeout

文件说:

--stop-timeout 停止容器的超时时间(以秒为单位)

这是我的Docker版本:

Client:
 Version:       17.12.0-ce
 API version:   1.35
 Go version:    go1.9.2
 Git commit:    c97c6d6
 Built: Wed Dec 27 20:03:51 2017
 OS/Arch:       darwin/amd64

Server:
 Engine:
  Version:      17.12.0-ce
  API version:  1.35 (minimum version 1.12)
  Go version:   go1.9.2
  Git commit:   c97c6d6
  Built:        Wed Dec 27 20:12:29 2017
  OS/Arch:      linux/amd64
  Experimental: true
Run Code Online (Sandbox Code Playgroud)

API版本比1.25更新。

use*_*097 5

你可以试试

timeout 3 docker run...

有关于这个主题的公关

https://github.com/moby/moby/issues/1905

也可以看看

Docker容器超时?


Est*_*cia 5

--stop-timeout选项是 docker 在使用时应等待容器停止的最长时间docker stop命令。

当容器被告知或命令运行完成时,容器将停止,因此如果您将 sleep 从 100 更改为 1,您将看到容器在一秒钟后停止。

我建议你做的是改变 ENTRYPOINT容器的您创建的脚本,该脚本将执行您想要的内容并从内部跟踪执行时间并在超时时退出。

之后,您可以使用 --rm脚本完成后将其删除选项。

一个小例子。

Dockerfile:

FROM ubuntu:16.04

ADD ./script.sh /script.sh

ENTRYPOINT /script.sh
Run Code Online (Sandbox Code Playgroud)

脚本.sh:

#!/bin/bash

timeout=5
sleep_for=1

sleep 100 &

find_process=$(ps aux | grep -v "grep" | grep "sleep")

while [ ! -z "$find_process" ]; do
    find_process=$(ps aux | grep -v "grep" | grep "sleep")

    if [ "$timeout" -le "0" ]; then
      echo "Timeout"
      exit 1
    fi

    timeout=$(($timeout - $sleep_for))
    sleep $sleep_for
done

exit 0
Run Code Online (Sandbox Code Playgroud)

使用以下命令运行它:

docker build -t testing .
docker run --rm testing
Run Code Online (Sandbox Code Playgroud)

这个脚本会执行 sleep 100在后台,检查它是否仍在运行,是否达到 5 秒的超时,然后退出。

这可能不是最好的方法,但如果你想做一些简单的事情,它可能会有所帮助。


mas*_*ilo 5

docker run --rm ubuntu timeout 2 sh -c 'echo start && sleep 30 && echo finish'
Run Code Online (Sandbox Code Playgroud)

将在 2 秒后终止,并且永远不会输出 finish


ing*_*net 5

根据您想要实现的具体目标,--ulimit参数 todocker run可能会满足您的需要。例如:

docker run --rm -it --ulimit cpu=1 debian:buster bash -c '(while true; do true; done)'
Run Code Online (Sandbox Code Playgroud)

大约 1 秒后,将打印Killed并返回。有了这个--ulimit选项,它就会永远符文。

但请注意,这仅限制CPU时间,而不限制挂钟时间。你可以愉快地使用sleep 24ha运行--ulimit cpu=1,因为sleep不消耗 CPU 时间。