如何将 Python 模块添加到 docker 容器?
How to add a Python module to a docker container?
我从 Divio Django 项目模板创建了一个样板项目:
(Python 3.6, Django CMS, HTML 5)
检查存储库 returns 几个文件,其中有一个 docker-compose
和一个 dockerfile。
Docker-撰写:
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'
有什么想法吗?
当以交互方式启动容器时,我可以重现错误:
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'
使用 Dockerfile 安装 python 个包。
Dockerfile 内容
FROM python:3
RUN pip install --upgrade pip && \
pip install aldryn_apphooks_config
$: docker build -t "web:python" .
Sending build context to Docker daemon 3.584kB
Step 1/2 : FROM python:3
---> 59a8c21b72d4
Step 2/2 : RUN pip install --upgrade pip && pip install aldryn_apphooks_config
---> Running in e16a679af3d8
.
.
.
.
Successfully built aldryn-apphooks-config django-treebeard djangocms-admin-style
Installing collected packages: pytz, Django, django-appdata, django-treebeard, django-classy-tags, django-sekizai, djangocms-admin-style, django-formtools, django-cms, aldryn-apphooks-config
Successfully installed Django-2.1.8 aldryn-apphooks-config-0.5.2 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
Removing intermediate container e16a679af3d8
---> 78ecd015d983
Successfully built 78ecd015d983
Successfully tagged web:python
启动容器并验证包安装。
$ 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
文件。
参见How to install Python dependencies in a project 。
Divio 提供的 Dockerfile 将在您构建项目时处理此问题:docker-compose build web
。
我从 Divio Django 项目模板创建了一个样板项目: (Python 3.6, Django CMS, HTML 5)
检查存储库 returns 几个文件,其中有一个 docker-compose
和一个 dockerfile。
Docker-撰写:
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'
有什么想法吗?
当以交互方式启动容器时,我可以重现错误:
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'
使用 Dockerfile 安装 python 个包。
Dockerfile 内容
FROM python:3
RUN pip install --upgrade pip && \
pip install aldryn_apphooks_config
$: docker build -t "web:python" .
Sending build context to Docker daemon 3.584kB
Step 1/2 : FROM python:3
---> 59a8c21b72d4
Step 2/2 : RUN pip install --upgrade pip && pip install aldryn_apphooks_config
---> Running in e16a679af3d8
.
.
.
.
Successfully built aldryn-apphooks-config django-treebeard djangocms-admin-style
Installing collected packages: pytz, Django, django-appdata, django-treebeard, django-classy-tags, django-sekizai, djangocms-admin-style, django-formtools, django-cms, aldryn-apphooks-config
Successfully installed Django-2.1.8 aldryn-apphooks-config-0.5.2 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
Removing intermediate container e16a679af3d8
---> 78ecd015d983
Successfully built 78ecd015d983
Successfully tagged web:python
启动容器并验证包安装。
$ 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
文件。
参见How to install Python dependencies in a project 。
Divio 提供的 Dockerfile 将在您构建项目时处理此问题:docker-compose build web
。