У меня есть веб-приложение 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?