Сценарий Python не выполняется внутри контейнера Docker - PullRequest
0 голосов
/ 03 июня 2019

У меня есть следующий простой скрипт на python, который отлично работает локально:

script.py

with open('data.txt', 'a+') as f:
    data = 'some data to be written to the file'
    f.write(data)

Я создал образ докера, используя нижеприведенное:

FROM python:3
ADD script.py / 
CMD ["python","./script.py"]

Я могу запустить контейнер в интерактивном режиме и увидеть там мой скрипт, но он, похоже, не был выполнен, так как нет файла data.txt? Я в недоумении.

PS C:\Docker\docker_chemtrail> docker run -it python-image-test /bin/bash
root@dea1f3583dd9:/# ls -l
total 68
drwxr-xr-x   1 root root 4096 May  8 01:41 bin
drwxr-xr-x   2 root root 4096 Mar 28 09:12 boot
drwxr-xr-x   5 root root  360 Jun  3 06:11 dev
drwxr-xr-x   1 root root 4096 Jun  3 06:11 etc
drwxr-xr-x   2 root root 4096 Mar 28 09:12 home
drwxr-xr-x   1 root root 4096 May  8 01:41 lib
drwxr-xr-x   2 root root 4096 May  6 00:00 lib64
drwxr-xr-x   2 root root 4096 May  6 00:00 media
drwxr-xr-x   2 root root 4096 May  6 00:00 mnt
drwxr-xr-x   2 root root 4096 May  6 00:00 opt
dr-xr-xr-x 118 root root    0 Jun  3 06:11 proc
drwx------   1 root root 4096 May  8 05:27 root
drwxr-xr-x   3 root root 4096 May  6 00:00 run
drwxr-xr-x   1 root root 4096 May  8 01:40 sbin
-rwxr-xr-x   1 root root  102 Jun  3 05:40 script.py
drwxr-xr-x   2 root root 4096 May  6 00:00 srv
dr-xr-xr-x  13 root root    0 Jun  3 06:03 sys
drwxrwxrwt   1 root root 4096 May  8 05:30 tmp
drwxr-xr-x   1 root root 4096 May  6 00:00 usr
drwxr-xr-x   1 root root 4096 May  6 00:00 var
root@dea1f3583dd9:/#

Следует отметить, что я новичок в Python, Docker и Linux :) Заранее прошу прощения:)

1 Ответ

1 голос
/ 03 июня 2019

Ваш контейнер завершен, потому что ваш скрипт script.py завершается немедленно.Для того, чтобы контейнер работал и работал, вы должны держать процесс на переднем плане.

Я попытался немного изменить скрипт, добавив функцию сна, и это сработало -

import time

with open('data.txt', 'a+') as f:
    data = 'some data to be written to the file'
    f.write(data)

time.sleep(60)

Теперь, если вы сделаете docker ps, вы должны увидеть свой контейнер вверх ивыполняется, но это только на минуту, потому что опубликуйте, что ваш скрипт завершит работу.

Подумайте о вашем контейнере как об одном процессе, если процесс выполнил свою работу, он должен завершиться.

Если поесли вы хотите запустить скрипт, увидеть вывод, но все еще хотите, чтобы контейнер работал и работал, вы можете сделать что-то вроде ниже (взломать) в Dockerfile -

FROM python:3
ADD script.py /
RUN python ./script.py && \
    cat data.txt
CMD tail -f /dev/null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...