如何在带有 alpine base 的 dockerfile 中使用超时?
How to use timeout in dockerfile with alpine base?
上下文
我正在编写一个 docker 文件,其中我 运行 基于 alpine:3.9
docker 图像的服务器应用程序。我通过 运行 测试我的应用程序是否正确安装并发送带有 curl
.
的 GET
请求
我会发送请求,直到得到答复。因此,如果遇到麻烦,我想使用内置的 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...
显示。
如何解决这个问题?
反思/测试
我测试了多项,超时功能运行良好。在docker文件中使用或在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..."'
在 dockerfile 上下文中,可以使用 https://github.com/krallin/tini
工具解决 pb。
使用以下 Dockerfile:
FROM alpine:3.9
RUN apk add --no-cache tini
RUN /sbin/tini timeout -t 2 /bin/sh -c 'sleep 5; echo "Not to be seen..."'
正在执行docker build .
结果
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM alpine:3.9
---> 055936d39205
Step 2/3 : RUN apk add --no-cache tini
---> Running in 018e342caa67
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/community/x86_64/APKINDEX.tar.gz
(1/1) Installing tini (0.18.0-r0)
Executing busybox-1.29.3-r10.trigger
OK: 6 MiB in 15 packages
Removing intermediate container 018e342caa67
---> 915c3d5dc7fe
Step 3/3 : RUN /sbin/tini timeout -t 2 /bin/sh -c 'sleep 5; echo "Not to be seen..."'
---> Running in 3852a4f6a43d
The command '/bin/sh -c /sbin/tini timeout -t 2 /bin/sh -c 'sleep 5; echo "Not to be seen..."'' returned a non-zero code: 143
正如所见,构建已停止,代码为 143。
使用外部工具强加解决方案。如果有更直接的解决方案,请随时提出。
PS:感谢@Eduardo Baitello 让我走上了正确的道路:)
Dockerfile中的超时选项,您可以直接嵌入timeout <value>
用于Dockerfile中的命令
例如:
ARG GOLANG=golang:1.16.4-alpine3.12
FROM ${GOLANG}
RUN timeout 60 curl -sL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh```
上下文
我正在编写一个 docker 文件,其中我 运行 基于 alpine:3.9
docker 图像的服务器应用程序。我通过 运行 测试我的应用程序是否正确安装并发送带有 curl
.
GET
请求
我会发送请求,直到得到答复。因此,如果遇到麻烦,我想使用内置的 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...
显示。
如何解决这个问题?
反思/测试
我测试了多项,超时功能运行良好。在docker文件中使用或在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..."'
在 dockerfile 上下文中,可以使用 https://github.com/krallin/tini
工具解决 pb。
使用以下 Dockerfile:
FROM alpine:3.9
RUN apk add --no-cache tini
RUN /sbin/tini timeout -t 2 /bin/sh -c 'sleep 5; echo "Not to be seen..."'
正在执行docker build .
结果
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM alpine:3.9
---> 055936d39205
Step 2/3 : RUN apk add --no-cache tini
---> Running in 018e342caa67
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/community/x86_64/APKINDEX.tar.gz
(1/1) Installing tini (0.18.0-r0)
Executing busybox-1.29.3-r10.trigger
OK: 6 MiB in 15 packages
Removing intermediate container 018e342caa67
---> 915c3d5dc7fe
Step 3/3 : RUN /sbin/tini timeout -t 2 /bin/sh -c 'sleep 5; echo "Not to be seen..."'
---> Running in 3852a4f6a43d
The command '/bin/sh -c /sbin/tini timeout -t 2 /bin/sh -c 'sleep 5; echo "Not to be seen..."'' returned a non-zero code: 143
正如所见,构建已停止,代码为 143。
使用外部工具强加解决方案。如果有更直接的解决方案,请随时提出。
PS:感谢@Eduardo Baitello 让我走上了正确的道路:)
Dockerfile中的超时选项,您可以直接嵌入timeout <value>
用于Dockerfile中的命令
例如:
ARG GOLANG=golang:1.16.4-alpine3.12
FROM ${GOLANG}
RUN timeout 60 curl -sL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh```