docker - 如何在带有alpine base的dockerfile中使用超时?

标签 docker timeout alpine

语境

我正在编写一个dockerfile,在其中运行基于alpine:3.9 docker镜像的服务器应用程序。我通过运行应用程序并发送带有GETcurl请求来测试我的应用程序是否正确安装。

我发送请求,直到得到答案。因此,万一遇到麻烦,我想使用内置的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/

相关文章:

docker - Dockerfile 中的 `touch` 是做什么的?

javascript - AngularJS $超时不起作用

c# - System.Threading.Timer 是否有基于任务的替代品?

docker - 在Alpine Linux上构建glibc时出错

php - Libresolv 对 Alpine linux 的依赖

java - Tomcat Docker Image和软件出现问题

docker - 我的 react docker 网页没有绑定(bind)到主机

linux - 我应该使用 Docker 在 Linux 操作系统中创建 Linux 操作系统吗?

C++:如何为任意函数调用实现超时?

ubuntu - 服务器设置 : Subdomain or different port for API and single or multiple ssl certificates for a docker, nginx、web 和 api 设置?