web-dev-qa-db-fra.com

Comment ajouter un Python Module à un conteneur Docker?

J'ai créé un projet de chaudière à partir du Divio Django: ( Python 3.6, Django CMS, HTML 5 ) ==)

Vérifier le référentiel renvoie quelques fichiers parmi lesquels sont un docker-compose et un 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"

Donc localement j'essaie de courir

docker-compose run web

pour démarrer un fichier local Django CMS instance. Cependant, je rencontre l'erreur suivante:

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'

Des idées?

Je peux reproduire l'erreur lors du démarrage du conteneur de manière interactive:

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'
3
TMOTTM

Utilisez DockerFile pour installer python packages.

Contenu 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

Démarrez le conteneur et vérifiez l'installation du package.

$ 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
3
Sreenivasa Reddy

vous pouvez utiliser un requirements.txt déposer. Écrire votre module pour importer et l'appeler dans votre dockerfile

$ more requirements.txt 
paramiko
lxml
pg8000

Et dans votre dockerfile:

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