труба и grep в контейнере Docker, кажется, заблокированы - PullRequest
1 голос
/ 06 марта 2019

У меня есть простой скрипт bash, который является частью образа докера.

test.sh * * 1004

#!/bin/bash

set -e

logit() {
    log_date=`date +"%F %T"`
    echo "[$log_date][INFO] $1"
}

waitForServerToStart() {
    while true; do
        logit "Testing .... 1"
        netstat -anpt
        logit "Testing .... 2"
        netstat -anpt | grep tcp
        logit "Testing .... 3"
        sleep 5
        logit "Testing .... 4"
    done
}

waitForServerToStart

run.sh

#!/bin/sh

/test.sh &

# Run forever
while true; do sleep 5; done

Dockerfile,

FROM openjdk:8u191-jre-alpine3.9

COPY files/run.sh /
COPY files/test.sh /

CMD ["/run.sh"]

Если я запускаю этот контейнер, я получаю только следующий вывод, который заставляет меня поверить, что grep и "труба" кажется заблокированной.

[2019-03-06 11:10:45][INFO] Testing .... 1
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 172.17.0.2:58278        xxx.xxx.xx.xx:443     FIN_WAIT2   -
[2019-03-06 11:10:45][INFO] Testing .... 2 

Может кто-нибудь, пожалуйста, пролить свет на это?

Работает нормально, если я закомментирую netstat -anpt | grep tcp. Затем я увидел бы последующие строки журнала, и он также продолжил бы цикл.

[2019-03-06 11:25:36][INFO] Testing .... 3
[2019-03-06 11:25:41][INFO] Testing .... 4

1 Ответ

1 голос
/ 06 марта 2019

Это меня озадачило! Но у меня есть решение для вас:

Используйте awk вместо grep

В test.sh используйте это вместо:

netstat -anpt | awk /tcp/

Чтобы файл выглядел так:

#!/bin/bash

set -e

logit() {
    log_date=`date +"%F %T"`
    echo "[$log_date][INFO] $1"
}

waitForServerToStart() {
    while true; do
        logit "Testing .... 1"
        netstat -anpt
        logit "Testing .... 2"
        netstat -anpt | awk /tcp/
        logit "Testing .... 3"
        sleep 5
        logit "Testing .... 4"
    done
}

waitForServerToStart

По причине, которую я не могу объяснить - grep не вернется при чтении из канала при вызове из скрипта. Я создал ваш контейнер локально, запустил его и ввел - и команда netstat -anpt | grep tcp работает нормально и завершается. Если вы замените его на netstat -anpt | cat в вашем скрипте test.sh, то оно также пройдет просто отлично.

Я повсюду искал кого-то с идентичной проблемой с grep в контейнере из используемого вами дистрибутива, версией и т. Д. - но пришел с пустыми руками.

Я полагаю, что это может иметь отношение к grep, ожидающему персонажа EOF, который никогда не приземляется - но я не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...