Как использовать тайм-аут в dockerfile с альпийской базой? - PullRequest
0 голосов
/ 31 октября 2019

Context

Я пишу dockerfile, где запускаю серверное приложение на основе alpine:3.9 образа docker. Я проверяю, правильно ли установлено мое приложение, запустив его и отправив запрос GET с curl.

. Я отправляю запросы, пока не получу ответ. Поэтому в случае проблем я хочу тайм-аут своих тестов с использованием встроенной функции timeout.

Предварительные требования

Я использую докер version 19.03.4, build 9013bf583a в Debian.

Проблема

Команда:

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. Иdisplay 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. Ничего не отображается, как ожидалось.

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

В контексте 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 за то, что я выбрал правильный путь:)

0 голосов
/ 01 ноября 2019

Многие программы сбрасывают обработчики сигналов по умолчанию при запуске в качестве 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..."'

...