#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
.