Python on Win Nano Server контейнер DLL ошибки импорта - PullRequest
0 голосов
/ 15 октября 2018

У меня есть веб-приложение Django, которое я хочу попробовать развернуть в контейнере Windows Nano Server Docker.Приложение зависит от пары двоичных файлов Windows (файлы .exe), поэтому я не могу на этом этапе перенести его на * nix.Это также зависит от библиотеки подушек.

Я создал Dockerfile, который начинается с образа stefanscherer/python-windows:nano, который выглядит как Nano Server с установленным Python 3.6.4.У меня есть сценарий PowerShell, который управляет настройкой venv, размещением файлов там, где они нужны, а также извлечением двоичных зависимостей Windows и размещением их в нужных местах.

Сценарий запускает pip install -r requirements, который успешно устанавливает все перечисленные пакеты.Однако, когда мой скрипт запускает команду python manage.py migrate для настройки локальной базы данных, я получаю ошибку импорта DLL в подушку:

Setting up database: python manage.py migrate
Traceback (most recent call last):
File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
File "C:\vt\venv\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
    utility.execute()
File "C:\vt\venv\lib\site-packages\django\core\management\__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\vt\venv\lib\site-packages\django\core\management\base.py", line 316, in run_from_argv
    self.execute(*args, **cmd_options)
File "C:\vt\venv\lib\site-packages\django\core\management\base.py", line 350, in execute
    self.check()
File "C:\vt\venv\lib\site-packages\django\core\management\base.py", line 379, in check
    include_deployment_checks=include_deployment_checks,
File "C:\vt\venv\lib\site-packages\django\core\management\commands\migrate.py", line 60, in _run_checks
    issues.extend(super()._run_checks(**kwargs))
File "C:\vt\venv\lib\site-packages\django\core\management\base.py", line 366, in _run_checks
    return checks.run_checks(**kwargs)
File "C:\vt\venv\lib\site-packages\django\core\checks\registry.py", line 71, in run_checks
    new_errors = check(app_configs=app_configs)
File "C:\vt\venv\lib\site-packages\django\core\checks\urls.py", line 13, in check_url_config
    return check_resolver(resolver)
File "C:\vt\venv\lib\site-packages\django\core\checks\urls.py", line 23, in check_resolver
    return check_method()
File "C:\vt\venv\lib\site-packages\django\urls\resolvers.py", line 396, in check
    for pattern in self.url_patterns:
File "C:\vt\venv\lib\site-packages\django\utils\functional.py", line 37, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
File "C:\vt\venv\lib\site-packages\django\urls\resolvers.py", line 533, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "C:\vt\venv\lib\site-packages\django\utils\functional.py", line 37, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
File "C:\vt\venv\lib\site-packages\django\urls\resolvers.py", line 526, in urlconf_module
    return import_module(self.urlconf_name)
File "C:\Python\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "C:\vt\smartclass\smartclass\urls.py", line 13, in <module>
    path('', include('faq_video_portal.urls')),
File "C:\vt\venv\lib\site-packages\django\urls\conf.py", line 34, in include
    urlconf_module = import_module(urlconf_module)
File "C:\Python\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "C:\vt\smartclass\faq_video_portal\urls.py", line 3, in <module>
    from .views.course_views import *
File "C:\vt\smartclass\faq_video_portal\views\course_views.py", line 6, in <module>
    from PIL import Image
File "C:\vt\venv\lib\site-packages\PIL\Image.py", line 64, in <module>
    from . import _imaging as core
ImportError: DLL load failed: The specified procedure could not be found.

Я искал всю информацию по этой проблеме, и большинствосообщения указывают на проблемы с подушкой 4.0 и Python 3.6.0.В моем файле требований не указана версия, поэтому он использует Pillow 5.3.0.В нескольких публикациях просто указывалось «обновить до Python 3.6.1 или более поздней версии, так как она устраняет проблему импорта DLL, и / или попробовать Pillow 4.1.1 или более позднюю версию».Но я на 3.6.4.Я уверен, что проблема как-то специфична для Nano Server.

Глядя еще дальше, я выяснил, что файл .pyd для Pillow зависит от библиотек во время выполнения Visual C ++ 2015, которые не включены вНано Сервер.Nano Server также не имеет установщика, поэтому я не мог просто добавить установщик среды выполнения VC ++ в команды моего Dockerfile.На странице Microsoft предлагалось просто скопировать необходимые двоичные файлы .dll в образ Nano Server, и он должен работать, поэтому я скопировал все файлы api-ms-crt-...dll по тому же пути в образе Nano Server.Однако сбой импорта DLL все еще происходит.

В качестве последнего средства я попытался переключиться на полный образ Python на Server Core (python:3-msservercore).Это не удалось, потому что когда pip установил Pillow, он, очевидно, решил, что ему нужно скомпилировать себя, и, конечно, в контейнере нет среды компилятора C

Как я могу дополнительно диагностировать и устранить ошибку импорта, возникающую на Nano Server?

...