У меня есть 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)
но он просто ничего не выдает