gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:04:57 25 4
gpt4 key购买 nike

语境

我正在编写一个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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com