【问题标题】:How to use timeout in dockerfile with alpine base?如何在具有高山基础的 dockerfile 中使用超时?
【发布时间】:2019-10-31 18:22:50
【问题描述】:

上下文

我正在编写一个 dockerfile,在其中运行基于 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...

如何解决这个问题?

反思/测试

我测试了很多东西,超时功能运行良好。在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。没有按预期显示。

【问题讨论】:

    标签: docker timeout alpine


    【解决方案1】:

    许多程序在以 PID 1 运行时会丢弃默认信号处理程序(包括 /bin/sh)。

    您需要使用--init 标志才能使容器正确退出:

    --init 在容器内运行一个init,转发信号并收获进程

    这应该可行:

    docker run --rm -it --init alpine:3.9 timeout -t 2 /bin/sh -c 'sleep 5; echo "Not to be seen..."'

    【讨论】:

    • 感谢您的帮助,并对我迟到的回答感到抱歉。该解决方案在使用 docker run 命令时效果很好,但不适用于构建 Dockerfile。有没有在 Dockerfile 中使用超时的解决方案?
    【解决方案2】:

    在 dockerfile 上下文中,pb 可以使用https://github.com/krallin/tini 工具解决。

    使用以下 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 让我走上了正确的道路:)

    【讨论】:

      【解决方案3】:

      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```
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多