Я выполняю множество задач, связанных со средствами массовой информации, используя контент, который обрабатывается в разных контейнерах Docker, и мне хотелось бы получить несколько советов о том, как создать простой, оптимизированный рабочий процесс.В частности, я не уверен, когда использовать сценарии оболочки, а когда использовать файлы Docker.
Общая последовательность событий:
- Преобразование входного видео в последовательность изображений
- Обработка этой последовательности изображений
- Преобразование обработанных изображений обратно в видео
- Сохранение этого видео на хосте
Каждое из них запускается сдругая команда docker run
.Я хочу, чтобы эти процессы были написаны так, чтобы мне не приходилось сидеть в командной строке и вводить docker run image_name etc. etc.
каждый раз, когда я хочу это сделать.
Шаг 1. запускается какследующее:
docker run -v $PWD:/temp/ jrottenberg/ffmpeg -i /temp/$SRC_VIDEO_DIR/$FILENAME /temp/$OUTPUT_IMAGE_DIR/$OUTPUT_IMAGE_BASENAME%06d.bmp
Шаг 2. выполняется следующим образом:
docker run -v $PWD/$OUTPUT_IMAGE_DIR:/notebook/raisr/test -v $PWD/$OUTPUT_LARGER_IMAGE_DIR:/notebook/raisr/results $DOCKER_IMAGE /bin/bash -c "source activate superres; cd /notebook/raisr; python test.py"
Шаг 3. запускается следующим образом:
docker run -v $PWD:/temp/ jrottenberg/ffmpeg -framerate $FPS -i /temp/$OUTPUT_IMAGE_DIR/$OUTPUT_IMAGE_BASENAME%06d.bmp -c:v qtrle -pix_fmt rgb24 /temp/output_video/$OUTPUT_FILENAME
Самый простой способ сделать это - создать сценарий оболочки с этими тремя командами и просто запуститьэтот сценарий.Раздражает то, что мне приходится редактировать скрипт оболочки и каждый раз менять путь ввода видеофайла.Кроме того, вызов 3 команд на шаге 2. не кажется обычной практикой.
Я понимаю, что могу использовать опцию RUN
в Dockerfile, чтобы указать, что эти команды автоматически запускаются при сборке файла Docker., но монтирование томов через Dockerfile и получение данных из работающего контейнера и к хосту было большой проблемой.И некоторые из этих команд зависят от того, какой образ Docker устанавливается локально с определенным именем (переменная $DOCKER_IMAGE
на шаге 2 выше.
Итак:
Когда у вас есть несколько команд docker run
, каждая из которых полагается на данные друг друга, каков правильный, масштабируемый способ выполнения этих команд?
Когдалюди используют сценарии оболочки, и когда люди используют Dockerfiles для управления несколькими заданиями?
Рекомендуется ли Dockerfile запускать задание, которое обрабатывает носители, или должноэто можно сделать из сценария оболочки в виде команды docker run
?