如何将Python模块添加到docker容器?

如何将Python模块添加到docker容器?,python,django,docker,django-cms,divio,Python,Django,Docker,Django Cms,Divio,我从Divio Django项目模板创建了一个样板项目: () 签出存储库将返回两个文件,其中包括一个docker compose和一个dockerfile Docker compose: version: "2" services: web: build: "." links: - "db:postgres" ports: - "8000:80" volumes: - ".:/app:rw" - "./dat

我从Divio Django项目模板创建了一个样板项目: ()

签出存储库将返回两个文件,其中包括一个
docker compose
和一个dockerfile

Docker compose:

version: "2"

services:
  web:
    build: "."
    links:
      - "db:postgres"
    ports:
      - "8000:80"
    volumes:
      - ".:/app:rw"
      - "./data:/data:rw"
    command: python manage.py runserver 0.0.0.0:80
    env_file: .env-local

  db:
    image: postgres:9.6-alpine
    environment:
      POSTGRES_DB: "db"
    volumes:
      - ".:/app:rw"
所以我试着在当地跑步

docker-compose run web
启动本地Django CMS实例。但是,我遇到了以下错误:

Starting ale_db_1 ... done
/app/addons/aldryn-django/aldryn_config.py:137: RuntimeWarning: no cache configured. Falling back to CACHE_URL=locmem://
  RuntimeWarning,
/app/addons/aldryn-django/aldryn_config.py:137: RuntimeWarning: no cache configured. Falling back to CACHE_URL=locmem://
  RuntimeWarning,
Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x7f42a18c4950>
Traceback (most recent call last):
  File "/virtualenv/lib/python3.6/site-packages/django/utils/autoreload.py", line 228, in wrapper
    fn(*args, **kwargs)
  File "/virtualenv/lib/python3.6/site-packages/django/core/management/commands/runserver.py", line 116, in inner_run
    autoreload.raise_last_exception()
  File "/virtualenv/lib/python3.6/site-packages/django/utils/autoreload.py", line 251, in raise_last_exception
    six.reraise(*_exception)
  File "/virtualenv/lib/python3.6/site-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/virtualenv/lib/python3.6/site-packages/django/utils/autoreload.py", line 228, in wrapper
    fn(*args, **kwargs)
  File "/virtualenv/lib/python3.6/site-packages/django/__init__.py", line 27, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/virtualenv/lib/python3.6/site-packages/django/apps/registry.py", line 85, in populate
    app_config = AppConfig.create(entry)
  File "/virtualenv/lib/python3.6/site-packages/django/apps/config.py", line 94, in create
    module = import_module(entry)
  File "/virtualenv/lib/python3.6/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 953, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'aldryn_apphooks_config'
正在启动ale\u db\u 1。。。完成
/app/addons/aldryn django/aldryn_config.py:137:RuntimeWarning:未配置缓存。返回缓存\u URL=locmem://
运行时警告,
/app/addons/aldryn django/aldryn_config.py:137:RuntimeWarning:未配置缓存。返回缓存\u URL=locmem://
运行时警告,
由启动的线程中存在未处理的异常
回溯(最近一次呼叫最后一次):
包装器中的文件“/virtualenv/lib/python3.6/site packages/django/utils/autoreload.py”,第228行
fn(*args,**kwargs)
文件“/virtualenv/lib/python3.6/site packages/django/core/management/commands/runserver.py”,第116行,在内部运行
autoreload.raise\u last\u异常()
文件“/virtualenv/lib/python3.6/site packages/django/utils/autoreload.py”,第251行,在raise\u last\u异常中
六、重放(*_例外)
文件“/virtualenv/lib/python3.6/site packages/django/utils/six.py”,第685行,在reraise中
通过_回溯(tb)提升值
包装器中的文件“/virtualenv/lib/python3.6/site packages/django/utils/autoreload.py”,第228行
fn(*args,**kwargs)
文件“/virtualenv/lib/python3.6/site packages/django/_init__.py”,第27行,在安装程序中
应用程序。填充(设置。已安装的应用程序)
文件“/virtualenv/lib/python3.6/site packages/django/apps/registry.py”,第85行,填充
app_config=AppConfig.create(条目)
文件“/virtualenv/lib/python3.6/site packages/django/apps/config.py”,第94行,在create中
模块=导入模块(条目)
文件“/virtualenv/lib/python3.6/importlib/\uuuu init\uuuuu.py”,第126行,在导入模块中
return _bootstrap._gcd_import(名称[级别:],包,级别)
文件“”,第994行,在_gcd_导入中
文件“”,第971行,在_find_和_load中
文件“”,第953行,在“查找”和“加载”中解锁
ModuleNotFoundError:没有名为'aldryn\u apphooks\u config'的模块
有什么想法吗

当以交互方式启动容器时,我可以重现错误:

mzh@ale $ docker run -it --rm divio/base:4.14-py3.6-slim-stretch /bin/bash
root@5d65902b34a4:/app# python
Python 3.6.8 (default, Mar 27 2019, 08:53:45) 
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import aldryn_apphooks_config
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'aldryn_apphooks_config'
mzh@ale$docker run-it--rm divio/base:4.14-py3.6-slim-stretch/bin/bash
root@5d65902b34a4:/app#python
Python 3.6.8(默认值,2019年3月27日,08:53:45)
[GCC 6.3.0 20170516]在linux上
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入aldryn_apphooks_配置
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ModuleNotFoundError:没有名为'aldryn\u apphooks\u config'的模块

使用Dockerfile安装python软件包

Dockerfile内容

FROM python:3

RUN pip install --upgrade pip && \
    pip install aldryn_apphooks_config
启动容器并验证包的安装

$ docker run -it web:python /bin/bash
root@1d1df7416b8a:/# pip freeze
aldryn-apphooks-config==0.5.2
Django==2.1.8
django-appdata==0.2.1
django-classy-tags==0.8.0
django-cms==3.6.0
django-formtools==2.1
django-sekizai==0.10.0
django-treebeard==4.3
djangocms-admin-style==1.3.0
pytz==2018.9

您可以使用
requirements.txt
文件。在dockerfile中编写要导入和调用的模块

$ more requirements.txt 
paramiko
lxml
pg8000
在您的dockerfile中:

ADD             ./requirements.txt ./
RUN             python3 -m pip install -r requirements.txt

如果您在本地运行Divio Cloud项目,那么添加Python模块的最佳方法是通过
requirements.in
文件


构建项目时,Divio提供的docker文件将处理此问题:
docker compose build web

这在Divio云项目中不是必需的-docker文件已包含处理需求文件
需求的说明。默认情况下,
中。看见
ADD             ./requirements.txt ./
RUN             python3 -m pip install -r requirements.txt