我想在docker容器中运行命令。如果命令完成时间超过3秒,则应删除容器。
我认为我可以使用--stop-timeout
中的docker run
选项来实现这一目标。
但看起来我的命令出了问题。
例如,docker run -d --stop-timeout 3 ubuntu:14.04 sleep 100
命令创建一个持续时间超过3秒的docker容器。第3秒后容器不会停止或删除。
我是否误解了--stop-timeout
的含义?
--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。
答案 0 :(得分:3)
答案 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提前退出!)都将被视为错误。