2017-11-17 1 views
2

Ich versuche, ein Python-Skript in einem Docker-Container auszuführen, und ich weiß nicht warum, Python kann keine der Python-Modul finden. Ich dachte, es hat etwas mit der PYTHONPATH env Variable zu tun, also habe ich versucht, es in der Dockerfile wie folgt hinzuzufügen: ENV PYTHONPATH $PYTHONPATH"ModuleNotFoundError: Kein Modul namens <package>" in meinem Docker-Container

Aber es hat nicht funktioniert. diese ist, was meine Dockerfile wie folgt aussieht:

FROM ubuntu:16.04 
MAINTAINER SaveMe [email protected] 

ADD . /app 
WORKDIR /app 

RUN apt-get update 

RUN DEBIAN_FRONTEND=noninteractive apt-get install -y locales 

# Set the locale 
RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' 
/etc/locale.gen && \ 
    locale-gen 
ENV LANG en_US.UTF-8 
ENV LANGUAGE en_US:en 
ENV LC_ALL en_US.UTF-8 
ENV PYTHONPATH ./app 

#Install dependencies 
RUN echo "===> Installing sudo to emulate normal OS behavior..." 
RUN apt-get install -y software-properties-common 
RUN apt-add-repository universe 
RUN add-apt-repository ppa:jonathonf/python-3.6 
RUN (apt-get update && apt-get upgrade -y -q && apt-get dist-upgrade - 
y -q && apt-get -y -q autoclean && apt-get -y -q autoremove) 
RUN apt-get install -y libxml2-dev libxslt-dev 
RUN apt-get install -y python3.6 python3.6-dev python3.6-venv openssl 
ca-certificates python3-pip 
RUN apt-get install -y python3-dev python-dev libffi-dev gfortran 
RUN apt-get install -y swig 
RUN apt-get install -y sshpass openssh-client rsync python-pip python- 
dev libffi-dev libssl-dev libxml2-dev libxslt1-dev libjpeg8-dev 
zlib1g-dev libpulse-dev 
RUN pip install --upgrade pip 
RUN pip install bugsnag 

#Install python package + requirements.txt 
RUN pip3 install -r requirements.txt 


CMD ["python3.6", "import_emails.py"] 

, wenn ich zu laufen bin versucht: sudo docker run <my_container> ich dieses Traceback bekam:

Traceback (most recent call last): 
    File "import_emails.py", line 9, in <module> 
    import bugsnag 
ModuleNotFoundError: No module named 'bugsnag' 

Wie man sehen kann ich verwende python3.6 für diese Projekt. Irgendwelche Hinweise darauf, wie man das löst?

+2

ich unten beantwortet, aber ich wollte Ihnen eine Empfehlung geben [minimieren Sie Ihre Schichten] (https: //docs.docker. com/engine/userguide/eng-image/dockerfile_best-practices/# Minimiere die Anzahl der Ebenen durch Kombinieren von RUN-Aufrufen. Abhängig von deiner Docker-Version mag das nicht viel ausmachen, aber wenn du erwartest, dass andere deine Bilder verwenden, glaube ich, dass es an diesem Punkt nicht nur funktionell, sondern auch richtig formatiert ist. – bluescores

Antwort

2

Im Inneren des Behälters, wenn ich pip install bugsnag, erhalte ich die folgende:

[email protected]:/app# pip install bugsnag 
Requirement already satisfied: bugsnag in /usr/local/lib/python2.7/dist-packages 
Requirement already satisfied: webob in /usr/local/lib/python2.7/dist-packages (from bugsnag) 
Requirement already satisfied: six<2,>=1.9 in /usr/local/lib/python2.7/dist-packages (from bugsnag) 

Sie wahrscheinlich das Problem hier sehen. Sie installieren das Paket für python2.7, das die Standardeinstellung des Betriebssystems ist, anstelle von python3.6, was Sie verwenden möchten.

Schauen Sie sich diese Antwort für die Hilfe der Lösung dieses Problems: "ModuleNotFoundError: No module named <package>" in my Docker container

Alternativ ist dies ein Problem virtualenv und ähnliche Werkzeuge zu lösen bedeutet, Sie in das auch aussehen könnte.

+0

Danke, eigentlich musste ich beide hinzufügen 'RUN python3.6 -m pip installieren --upgrade pip' und' RUN python3.6 -m pip installieren -r requirements.txt' (bugsnag war in meiner Anforderungsdatei). Aber jetzt, wenn ich mein Verzeichnis zu '/ app' hinzufüge, ignoriere ich einige Dateien und Verzeichnisse, ich weiß nicht warum. irgendeine Idee ? –

+0

@RayaneBouslimi schwer zu sagen, ohne Ihre Dateistruktur zu sehen. Wenn Sie Volumes in Ihrem "Docker Run" innerhalb von '/ app' mounten, werden Sie möglicherweise unbeabsichtigt über Dateien/Verzeichnisse, die Sie dort erwarten, über den' ADD'-Befehl im Build mounten. Hast du 'docker exec''d in deinen Container, um dich umzusehen? – bluescores

+0

Mein Fehler, Problem gelöst, mein Kollege hat die '.dockerignore' geändert, deshalb fehlte mir eine env-Variable! Vielen Dank für Ihre Zeit –

0

da Sie py3 verwenden, versuchen PIP3 mit bugsnag installieren statt pip

Verwandte Themen