Docker容器无法识别Django Formtools

问题描述 投票:0回答:1

我有一些使用Django表单工具的代码(特别是SessionWizardView)。从我所看到的,Formtools似乎在Docker Container之外工作,但在一个内部使用时失败。它正在发挥作用的环境。生产不受影响的Docker容器。

获得的错误消息是(在正在运行的容器的日志中):

from formtools.wizard.views import SessionWizardView ModuleNotFoundError: No module named 'formtools'

**我已经安装了formtools

C:\Users\dgmufasa>pip install django-formtools
Requirement already satisfied: django-formtools in c:\work\software\python64bitv3.6\lib\site-packages
Requirement already satisfied: Django>=1.8 in c:\work\software\python64bitv3.6\lib\site-packages\django-1.11.7-py3.6.egg (from django-formtools)
Requirement already satisfied: pytz in c:\work\software\python64bitv3.6\lib\site-packages\pytz-2017.3-py3.6.egg (from Django>=1.8->django-formtools)

我已将它添加到settings.py文件中的INSTALLED_APPS

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',

     [..snip ..]

    'formtools',
]

我已将它用作程序的一部分:

from django.shortcuts import render, render_to_response
from formtools.wizard.views import SessionWizardView
#from django.contrib.formtools.wizard.views import SessionWizardView
from django.contrib.auth.decorators import login_required

[... snip ...]

在这个领域(开发)它一切正常 - 但是 - 当采用完全相同的代码,创建一个Docker文件并将其投入生产时,我得到了错误。

**requirements.txt for Docker build** file
Django==1.11.7
psycopg2
Pillow==4.3.0
bcrypt==3.1.4
cffi==1.11.2
django-formtools
django-phonenumber-field==1.3.0
googlemaps==2.5.1
geocoder==1.33.0
geopy==1.11.0
pandas==0.21.1

在使用requirements.txt的构建期间

Step 6/14 : RUN set -x &&   pip install -r requirements.txt &&  apt-get update &&   apt-get install -y alien wget libaio1 &&    wget -P /tmp/ http://oss-config-file.oss-cn-beijing.aliyuncs.com/docker-config-file/tools/oracle_client/oracle-instantclient12.2-basiclite-12.2.0.1.0-1.x86_64.rpm &&   wget -P /tmp/ http://oss-config-file.oss-cn-beijing.aliyuncs.com/docker-config-file/tools/oracle_client/oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm &&   alien -iv /tmp/oracle-instantclient12.2-basiclite-12.2.0.1.0-1.x86_64.rpm &&    alien -iv /tmp/oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm &&    pip3 install cx_Oracle &&   apt-get purge -y alien perl perl5 wget && apt-get -y autoremove && apt-get clean &&     rm -rf /tmp/oracle-* && rm -rf /usr/share/docs && rm -rf /usr/share/man
 ---> Running in 06350c1369d6
[91m+ pip install -r requirements.txt
[0mCollecting Django==1.11.7 (from -r requirements.txt (line 1))
  Downloading Django-1.11.7-py2.py3-none-any.whl (6.9MB)
Collecting psycopg2 (from -r requirements.txt (line 2))
  Downloading psycopg2-2.7.3.2-cp36-cp36m-manylinux1_x86_64.whl (2.7MB)
Collecting Pillow==4.3.0 (from -r requirements.txt (line 3))
  Downloading Pillow-4.3.0-cp36-cp36m-manylinux1_x86_64.whl (5.8MB)
Collecting bcrypt==3.1.4 (from -r requirements.txt (line 4))
  Downloading bcrypt-3.1.4-cp36-cp36m-manylinux1_x86_64.whl (54kB)
Collecting cffi==1.11.2 (from -r requirements.txt (line 5))
  Downloading cffi-1.11.2-cp36-cp36m-manylinux1_x86_64.whl (419kB)
Collecting django-formtools (from -r requirements.txt (line 6))
  Downloading django_formtools-2.1-py2.py3-none-any.whl (132kB)
Collecting django-phonenumber-field==1.3.0 (from -r requirements.txt (line 7))
  Downloading django-phonenumber-field-1.3.0.tar.gz
Collecting googlemaps==2.5.1 (from -r requirements.txt (line 8))
  Downloading googlemaps-2.5.1.tar.gz

可以看到:收集django-formtools(来自-r requirements.txt(第6行))下载django_formtools-2.1-py2.py3-none-any.whl(132kB)

所以,看起来Docker正在收集它 - 但是 - 在运行代码时,

这是用于启动容器的内容:

docker-compose -f $ FILE_EXTRACTION / docker-compose.yml up --no-deps -d web_work 2>&1

这是导致的错误(来自容器的日志):

File "<frozen importlib._bootstrap>", line 961, in _find_and_load
  File "<frozen importlib._bootstrap>", line 950, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 655, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed
  File "/code/backendworkproj/mainadmin/urls.py", line 2, in <module>
    from mainadmin import views
  File "/code/backendworkproj/mainadmin/views.py", line 21, in <module>
    from formtools.wizard.views import SessionWizardView
ModuleNotFoundError: No module named 'formtools'

为什么会这样?

Update

以下是成功安装的部分:

Successfully built django-phonenumber-field googlemaps olefile pycparser future
Installing collected packages: pytz, Django, psycopg2, olefile, Pillow, six, pycparser, cffi, bcrypt, django-formtools, babel, phonenumberslite, django-phonenumber-field, certifi, urllib3, idna, chardet, requests, googlemaps, click, future, decorator, ratelim, geocoder, geopy, numpy, python-dateutil, pandas
Successfully installed Django-1.11.7 Pillow-4.3.0 babel-2.5.1 bcrypt-3.1.4 certifi-2017.11.5 cffi-1.11.2 chardet-3.0.4 click-6.7 decorator-4.1.2 django-formtools-2.1 django-phonenumber-field-1.3.0 future-0.16.0 geocoder-1.33.0 geopy-1.11.0 googlemaps-2.5.1 idna-2.6 numpy-1.13.3 olefile-0.44 pandas-0.21.1 phonenumberslite-8.8.8 psycopg2-2.7.3.2 pycparser-2.18 python-dateutil-2.6.1 pytz-2017.3 ratelim-0.1.6 requests-2.18.4 six-1.11.0 urllib3-1.22
[91m+ apt-get update

开发机器上的Python(在Windows上)

C:\WORK\AppPython\ContractorsClubBackofficeCode>python --version
Python 3.6.3

Docker正在进行构建的Python(在Linux上)

python --version
Python 2.7.12

我想我可以尝试在Docker构建正在进行的机器上升级Python。你觉得那会有用吗?

Update

似乎Dockerbuild本身使用的是Python 3.6.2

Step 7/14 : ADD . /code/
 ---> 9b9a1988e8bf
Step 8/14 : COPY *.pth /usr/local/lib/python3.6/site-packages/      <<<<<< using python 3.6???
 ---> c66a7c622993
Step 9/14 : RUN DATABASE_URL=none python3 /code/backendworkproj/manage.py collectstatic --noinput
 ---> Running in 048fe0c7144f

[... snip ....]

Copying '/code/backendworkproj/static/images/backendwork/TCC_ICON_FRONT-70.png'
Copying '/usr/local/lib/python3.6/site-packages/django/contrib/admin/static/admin/css/base.css'
Copying '/usr/local/lib/python3.6/site-packages/django/contrib/admin/static/admin/css/changelists.css'    <<<<<< using Python 3.6???
Copying '/usr/local/lib/python3.6/site-packages/django/contrib/admin/static/admin/css/rtl.css'
Copying '/usr/local/lib/python3.6/site-packages/django/contrib/admin/static/admin/css/dashboard.css'
Copying '/usr/local/lib/python3.6/site-packages/django/contrib/admin/static/admin/css/login.css'
[... snip ...]

Step 7/14 : ADD . /code/
 ---> 9b9a1988e8bf
Step 8/14 : COPY *.pth /usr/local/lib/python3.6/site-packages/      <<<<<< using Python 3.6???
 ---> c66a7c622993
Step 9/14 : RUN DATABASE_URL=none python3 /code/backendworkproj/manage.py collectstatic --noinput

下面是目前正在使用的Dockerfile(虽然,我将python版本更改为3.6.3以查看会发生什么)

FROM python:3.6.2

ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/

RUN set -x &&\
        pip install -r requirements.txt &&\
        apt-get update &&\
        apt-get install -y alien wget libaio1 &&\
        wget -P /tmp/ http://oss-config-file.oss-cn-beijing.aliyuncs.com/docker-config-file/tools/oracle_client/oracle-instantclient12.2-basiclite-12.2.0.1.0-1.x86_64.rpm &&\
        wget -P /tmp/ http://oss-config-file.oss-cn-beijing.aliyuncs.com/docker-config-file/tools/oracle_client/oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm &&\
        alien -iv /tmp/oracle-instantclient12.2-basiclite-12.2.0.1.0-1.x86_64.rpm &&\
        alien -iv /tmp/oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm &&\
        pip3 install cx_Oracle &&\
        apt-get purge -y alien perl perl5 wget && apt-get -y autoremove && apt-get clean && \
        rm -rf /tmp/oracle-* && rm -rf /usr/share/docs && rm -rf /usr/share/manz`   

ADD . /code/

COPY *.pth  /usr/local/lib/python3.6/site-packages/

另外,是否有一组指令允许人们只需拉动Formtools Git repository并将其包含为Django app(在项目中)?再次 - 在开发方面 - 它的工作原理,在生产方(涉及Docker),它没有。使用它作为应用程序的思考可以使用pip install不...

python django python-3.x docker-compose
1个回答
1
投票

当您在Docker文件中使用pip install时,您将安装Python 2的软件包。请改用pip3

pip3 install -r requirements.txt

我认为你不需要COPY *.path线。一旦用pip3安装了所有需求,site-packages目录应包含它所需的一切。

© www.soinside.com 2019 - 2024. All rights reserved.