如何限制`docker run`执行时间?

时间:2018-01-17 10:54:00

标签: docker

我想在docker容器中运行命令。如果命令完成时间超过3秒,则应删除容器。

我认为我可以使用--stop-timeout中的docker run选项来实现这一目标。

但看起来我的命令出了问题。

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

我是否误解了--stop-timeout的含义?

document

  

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

这是我的泊坞版:

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

API版本高于1.25。

5 个答案:

答案 0 :(得分:3)

你可以尝试

timeout 3 docker run...

该主题有一个公关

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

另见

Docker timeout for container?

答案 1 :(得分:2)

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

当一个容器被告知或命令运行完毕时,它将停止运行,所以如果你改变你的睡眠时间从100到1,你会看到容器在一秒钟后停止。

我建议您做的是将容器的入口点更改为您创建的脚本,该脚本将执行您想要的操作并从内部跟踪执行时间并在超时时退出。

之后,您可以使用--rm选项启动容器,该选项将在脚本完成后将其删除。

一个小例子。

Dockerfile:

FROM ubuntu:16.04

ADD ./script.sh /script.sh

ENTRYPOINT /script.sh

script.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

使用:

docker build -t testing .
docker run --rm testing

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

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

答案 2 :(得分:2)

根据您要实现的目标,--ulimit的{​​{1}}参数可能会满足您的需求。例如:

docker run

大约1秒钟后,将打印docker run --rm -it --ulimit cpu=1 debian:buster bash -c '(while true; do true; done)' 并返回。使用Killed选项,它将永远符文。

但是,请注意,这仅限制了 CPU 时间,而不限制挂钟时间。您可以使用--ulimit来愉快地运行sleep 24h,因为--ulimit cpu=1不会占用CPU时间。

答案 3 :(得分:1)

docker run --rm ubuntu timeout 2 sh -c 'echo start && sleep 30 && echo finish'

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

答案 4 :(得分:0)

在我的情况下,我有一个Docker容器启动了Express服务器,然后保持运行状态,我想对CI进行简单测试以检查该容器可以启动而没有任何立即错误(例如配置错误)。 / p>

如果在启动过程中出现故障,我确保我的代码返回了非零的退出代码,然后结束了:

timeout 10 docker run [   container params   ]; test $? -eq 124 && echo "Container ran for 10 seconds without failing"

如果SIGTERM尚未死亡,它将在10秒后发送到Docker容器。如果生存时间足够长,可以进行超时,则it will return 124,这就是测试的目的。换句话说,这验证了Docker运行了足够长的时间以达到超时,任何错误(或代码0提前退出!)都将被视为错误。