语境
我正在编写一个dockerfile,在其中运行基于alpine:3.9
docker镜像的服务器应用程序。我通过运行应用程序并发送带有GET
的curl
请求来测试我的应用程序是否正确安装。
我发送请求,直到得到答案。因此,万一遇到麻烦,我想使用内置的timeout
函数使测试超时。
前提条件
我在debian上使用docker version 19.03.4, build 9013bf583a
。
问题
命令:
docker run --rm -it alpine:3.9 timeout -t 2 /bin/sh -c 'sleep 5; echo "Not to be seen..."'
退出并显示
Not to be seen...
。如果我以这种方式使用超时,那么超时似乎会被忽略...如果将其放入docker文件中,则会遇到相同的问题。
FROM alpine:3.9
RUN timeout -t 2 /bin/sh -c 'sleep 5; echo "Not to be seen..."'
docker build -t test .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM alpine:3.9
---> 055936d39205
Step 2/2 : RUN timeout -t 2 /bin/sh -c 'sleep 5; echo "Not to be seen..."'
---> Running in 0fa22cd02173
Not to be seen...
Removing intermediate container 0fa22cd02173
---> e88107c3811b
Successfully built e88107c3811b
Successfully tagged test:latest
我们可以看到控制台中显示的
Not to be seen...
。如何解决这个问题?
反射/测试
我测试了多件事,并且超时功能运行良好。在dockerfile中使用它或在
docker run
函数中传递它时应该是一个问题...当我尝试时:
docker run --rm -it alpine:3.9 /bin/sh
# Then in container
timeout -t 2 /bin/sh -c 'sleep 5; echo "Not to be seen..."'
退出并返回状态码143。并显示
Terminated
。当我尝试时:
docker run --rm --name test -td alpine:3.9 /bin/sh
docker exec -it test timeout -t 2 /bin/sh -c 'sleep 5; echo "Not to be seen..."'
退出并返回状态码143。未按预期显示任何内容。
最佳答案
当以PID 1(包括/bin/sh
)运行时,许多程序会丢弃默认信号处理程序。
您需要使用--init
标志才能使容器正确退出:
--init Run an init inside the container that forwards signals and reaps processes
这应该工作:
docker run --rm -it --init alpine:3.9 timeout -t 2 /bin/sh -c 'sleep 5; echo "Not to be seen..."'
关于docker - 如何在带有alpine base的dockerfile中使用超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58649277/