Как запустить образ 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
:
Следуйте Install client binaries on Linux для загрузки бинарных файлов docker clinet из prebuilt, тогда ваш
Django image
будет иметь командуdocker
.При запуске
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
.