Код, который вы показываете, должен быть чрезвычайно простым для установки без использования Docker, так как вы запускаете код Python из скрипта Python. Вы должны добавить длинный список пакетов pip, которые вы устанавливаете, в файл setup.py
или requirements.txt
вашего собственного приложения, а затем использовать обычный модуль subprocess
для запуска сценариев:
@app.route('/civitek/<f_name>/<l_name>/<ref_url>')
def civitek(f_name, l_name, ref_url):
p = subprocess.run([sys.executable, './florida/civitek_scraper.py'],
env={'F_NAME': f_name, 'L_NAME': l_name, 'REF_URL': ref_url})
with open('florida/output/output.html') as f:
return f.read()
(При использовании sys.executable
здесь будет использоваться тот же Python в вашей активной виртуальной среде; он не обязательно должен быть первым Python в $PATH
.)
Добавление Docker к этому добавляет огромное количество сложностей и соображений безопасности: если вы ошиблись, вы открываете возможность очень простого удаленного эксплойта root.
Если вы получаете ошибки разрешения, у вашего пользователя или группы нет разрешения на доступ к файлу сокета Docker. Проверьте вывод id
и ls -l /var/run/docker.sock
.
Использование exec
, которое вы показываете, и установка нового программного обеспечения в контейнер после запуска являются анти-шаблонами. (Должен ли ваш HTTP-запрос просто завершиться неудачей, если packages.python.org имеет временное отключение?) Напишите пользовательский образ Docker, который включает в себя все зависимости для вашего скрипта, и запустите этот скрипт в качестве основного процесса контейнера, если вам нужно запустить это в контейнере вообще.