python3 подпроцесс застрял в docker альпийском контейнере - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть python3 .7 альпийское изображение (python: 3.7.7-alpine3.10).

, когда я запускаю удар кода в контейнере:

import io
import time
import subprocess
import sys

filename = '/tmp/test.log'
with io.open(filename, 'wb') as writer, io.open(filename, 'rb', 1) as reader:
    process = subprocess.Popen("ping google.com", stdout=writer, shell=True)
    while process.poll() is None:
        sys.stdout.write(reader.read().decode("utf-8"))
        time.sleep(0.5)
    # Read the remaining
    sys.stdout.write(reader.read().decode("utf-8"))

он только выводит и записывает первую строку:

PING google.com (172.217.160.110): 56 data bytes

, затем ничего больше и процесс застревает.

он должен сохранять вывод на стандартный вывод и записывать в файл /tmp/test.log, который работает на моем ma c host

Я запускаю contaniner с --cap-add=SYS_PTRACE --security-opt seccomp=unconfined и запускаю в нем процесс, кажется, показывает, что ping работает правильно, продолжает пинговать

strace: Process 6 attached
recvfrom(0, 0x55ef843c29a0, 192, 0, 0x7ffdb0da2200, [16]) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} ---
clock_gettime(CLOCK_MONOTONIC, {tv_sec=1328545, tv_nsec=930698343}) = 0
sendto(0, "\10\0\245d\6\0\0*\312\35\202S\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64, 0, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("172.217.160.110")}, 28) = 64
rt_sigaction(SIGALRM, {sa_handler=0x55ef84325e4f, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f479076de21}, {sa_handler=0x55ef84325e4f, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f479076de21}, 8) = 0
setitimer(ITIMER_REAL, {it_interval={tv_sec=0, tv_usec=0}, it_value={tv_sec=1, tv_usec=0}}, NULL) = 0
rt_sigreturn({mask=[]})                 = 45
recvfrom(0, 0x55ef843c29a0, 192, 0, 0x7ffdb0da2200, [16]) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} ---
clock_gettime(CLOCK_MONOTONIC, {tv_sec=1328546, tv_nsec=934499243}) = 0
sendto(0, "\10\0}\22\6\0\0+\343n\221S\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64, 0, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("172.217.160.110")}, 28) = 64
rt_sigaction(SIGALRM, {sa_handler=0x55ef84325e4f, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f479076de21}, {sa_handler=0x55ef84325e4f, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7f479076de21}, 8) = 0
setitimer(ITIMER_REAL, {it_interval={tv_sec=0, tv_usec=0}, it_value={tv_sec=1, tv_usec=0}}, NULL) = 0
rt_sigreturn({mask=[]})                 = 45
recvfrom(0, ^Cstrace: Process 6 detached
 <detached ...>

Но код просто отлично работает на моем хосте ma c.

Я пробовал много раз, и он всегда зависает, что так шумно

Надеюсь, кто-нибудь поможет, Спасибо

----------------------------------- Обновление 2020.4.22 11:19 -------

Dockerfile

FROM python:3.7.7-alpine3.10

WORKDIR /app
COPY test.py .

RUN python test.py # RUN this test when exec "docker build"

test.py содержит приведенный выше код

Или вы можете просто скопировать код в test.py и запустить так

docker run  -v `pwd`:/tmp --cap-add=SYS_PTRACE --security-opt seccomp=unconfined python:3.7.7-alpine3.10 python3 /tmp/test.py

я тоже попробую код ниже

import io
import time
import subprocess
import sys

process = subprocess.Popen("ping google.com", stdout = subprocess.PIPE, stderr = subprocess.STDOUT,  shell=True)
while process.poll() is None:
    print("--" * 10)
    print(process.stdout.readline())
    time.sleep(0.5)

но он просто ничего не выдает

...