Как запустить образ docker из образа docker?

Я запускаю докеризованное приложение Django-celery, которое принимает некоторые пользовательские данные с веб-страницы и (предполагается) запускает двоичный файл unix на хост-системе для последующего анализа данных. Анализ данных занимает немного времени, поэтому я использую celery для асинхронного запуска. Программа анализа данных также докеризирована, поэтому мой рабочий django-celery должен выполнить os.system('docker run ...'). Однако celery говорит docker: command not found, очевидно, потому что docker не установлен в моем докер-образе Django. Каково наилучшее решение этой проблемы? Я не хочу запускать docker внутри docker, потому что мое аналитическое ПО должно иметь возможность использовать все системные ресурсы, а не только ресурсы, назначенные образу Django.

Я не хочу запускать docker внутри docker, потому что мое аналитическое программное обеспечение должно иметь возможность использовать все системные ресурсы, а не только ресурсы, назначенные образу Django.

Я не уловил здесь причинно-следственной связи. На самом деле, нам просто нужно добавить 2 шага к вашему Django image:

  1. Следуйте Install client binaries on Linux для загрузки бинарных файлов docker clinet из prebuilt, тогда ваш Django image будет иметь команду docker.

  2. При запуске Django image на основе контейнера, добавьте /var/run/docker.sock bind mount, это позволит Django image контейнеру напрямую общаться с docker daemon на хост-машине, и запускать data-analysis tool container на хосте. Поскольку analysis container не запускается в Django image container, они могут иметь отдельный системный ресурс. Другими словами, ресурс analysis container не зависит от ресурса Django image container.

Образцы с одним docker image, в которых уже есть docker client:

root@pie:~# ls /dev/fuse
/dev/fuse
root@pie:~# docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock docker /bin/sh
/ # ls /dev/fuse
ls: /dev/fuse: No such file or directory
/ # docker run --rm -it -v /dev:/dev alpine ls /dev/fuse
/dev/fuse

Вы можете видеть, что хотя начальный контейнер не имеет доступа к хосту /dev, но контейнер docker, команда которого инициализировалась из начального контейнера, действительно может иметь отдельные ресурсы и успешно обращаться к различным ресурсам.

Если вышеперечисленное то, что вам нужно, то это общее решение для вас, в противном случае вам придется установить analysis tool в вашем Django image.

Вернуться на верх