Контейнер Python docker завершает работу сразу после завершения запуска приложения, даже если указано, что он должен оставаться в-d -t

#python #docker #docker-container #docker-run #docker-exec

Вопрос:

У меня есть док-файл

 FROM python:3

WORKDIR /app

ADD ./venv ./venv

ADD ./data/file1.csv.gz ./data/file1.csv.gz

ADD ./data/file2.csv.gz ./data/file2.csv.gz

ADD ./requirements.txt ./venv/requirements.txt

WORKDIR /app/venv

RUN pip install --no-cache-dir -r requirements.txt

CMD ["python", "./src/script.py", "/app/data/file1.csv.gz", "/app/data/file2.csv.gz"]
 

После создания изображения из него и его запуска изображение запускает приложение должным образом, но затем контейнер завершает работу сразу после завершения. Это определенно проблематично, так как я не могу ожидать выходного файла.

Я пробовал использовать docker run -d -t <imgname> и docker ps показывать приложение в течение нескольких секунд, но снова, как только он завершает процесс, контейнер отключается.

Так что доступ к нему невозможен, даже docker exec <imgid> -it --entrypoint /bin/bash если он просто сразу же выходит.

Я также пытался добавить последнее RUN /bin/bash после последнего CMD , но это тоже не помогает.

Что я могу сделать на самом деле, чтобы войти в контейнер и проверить файл?

Комментарии:

1. Контейнер завершается, когда завершается процесс переднего плана: именно так все и работает. Если вы хотите, чтобы контейнер продолжал работать, вам нужно организовать выполнение команды. Вы можете добавить цикл в конце своего скрипта Python или продолжить его sleep inf или что-то в этом роде, но это должно быть частью вашего CMD . RUN операторы ничего не делают во время выполнения (они действуют только во время сборки ).

2. Завершается ли сценарий или выполняется как служба? Если вы ожидаете выходной файл, лучше всего смонтировать каталог.

Ответ №1:

До тех пор, пока контейнер не будет удален, вы сможете получить доступ к данным. Вы можете найти имя контейнера с помощью docker ps -a .

Затем, если вы знаете местоположение файла, вы можете скопировать его на свой хост с помощью

 docker cp <container name>:<file> .
 

Кроме того, вы можете зафиксировать содержимое контейнера в новом образе и запустить оболочку в нем с помощью

 docker commit <container name> newimagename
docker run --rm -it newimagename /bin/bash
 

Затем вы можете осмотреться в контейнере и найти свои файлы.

К сожалению, нет возможности снова запустить контейнер и осмотреться в нем. docker start запустит контейнер, но снова выполнит ту же команду, что и при запуске docker run .