Мониторинг изменений файлов в томах докеров

У меня есть контейнер докеров, который запускает python script: ожидает ввода запросов и обработки данных соответственно.

Поскольку я использую docker для разработки, , я бы хотел, чтобы всякий раз, когда я меняю исходный код этого файла python (на моей машине, а не на контейнере), контейнер останавливает python script и перезапускает это с новым кодом. Потому что сейчас я должен вручную остановить контейнер и перезапустить его. Я мог бы также следить за изменениями файлов на моей стороне (а не внутри контейнера), но я хотел бы избежать этого и сделать это внутри самого контейнера.

Я использую параметр docker-compose volumes для совместного использования исходного кода между моим FS и контейнером.

Чтобы отслеживать изменения файла, я пытаюсь использовать утилиту watchmedo из watchdog модуль python. У меня просто есть эта странная проблема, что я не могу заметить изменения файла этого исходного файла python, если я не редактирую его изнутри контейнера, а не в своей локальной FS, даже если они установлены с помощью volumes.

Мне кажется, что это связано с тем, как работает докер, а может и с томами. Я пытался прочитать его в Интернете, но не получил большой удачи. Есть идеи? Я полностью застрял!

EDIT: Здесь gif, который лучше объясняет это. Верхняя часть панелей подключается к одному и тому же контейнеру, а нижняя - к локальной машине. Все панели указаны в одной папке. gif

Ответ 1

Возможно, ваш контейнер запускает что-то вроде этого (необходимо установить inotify):

while true
do
        inotifywait -e create -e modify  /path/to/python/script
        pkill python
        python /path/to/python/script
done

В основном подождите изменений в файле, запустите python на машине, запустите script снова. Если python script не работает в фоновом режиме /deamonized любым способом, вы можете использовать a и так: python /path/to/python/script &

Поместите это в run.sh, добавьте что-то подобное в свой файл Dockerfile

COPY run.sh /run.sh
CMD ["bash", "-l", "/run.sh"]

... и вы должны быть хорошими.