Python wirft KeyError beim Exportieren von Umgebungsvariablen

Python wirft KeyError beim Exportieren von Umgebungsvariablen

Ich habe einen seltsamen Fall, in dem ich eine Datei secret.env habe, in der ich alle meine Umgebungsvariablen wie folgt einstelle:

geheim.env

export TWITTER_CONSUMER_KEY="something"
export TWITTER_CONSUMER_SECRET="something"

Dann habe ich eine Docker-Datei erstellt, um alle Variablen zu exportieren und die App wie folgt auszuführen:

FROM python:3.8-slim-buster

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install the dependencies
RUN pip install -r requirements.txt

RUN find . -name \*.pyc -delete

# Export all variables
RUN /bin/bash -c "source secret.env";

# tell the port number the container should expose
EXPOSE 8083

# run the command
ENTRYPOINT ["python", "run.py"]

Dies führt jedoch zu einem wichtigen Fehler:

$ docker run --name fortweet --rm -i -t fortweet:latest bash
Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from app import socketio, app
  File "/app/app/__init__.py", line 65, in <module>
    app = create_app()
  File "/app/app/__init__.py", line 38, in create_app
    my_settings = settings.TwitterSettings.get_instance()
  File "/app/app/setup/settings.py", line 47, in get_instance
    TwitterSettings()
  File "/app/app/setup/settings.py", line 14, in __init__
    self.consumer_key = os.environ["TWITTER_CONSUMER_KEY"]
  File "/usr/local/lib/python3.8/os.py", line 675, in __getitem__
    raise KeyError(key) from None
KeyError: 'TWITTER_CONSUMER_KEY'

Wenn ich dies unter Windows ausführe, funktioniert es einwandfrei!

Kann mir hierbei bitte jemand helfen?

Antwort1

Ändern Sie die letzte Zeile wie folgt:

ENTRYPOINT ["/bin/bash", "-c", "source secret.env ; python run.py"]

und entfernen Sie stattdessen den RUNOrt, an dem Sie die Beschaffung durchführen. Siehe auchhttps://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/für eine Erklärung des Unterschieds RUNzwischen CMDund ENTRYPOINT.

Kurzgesagt:

  • RUN führt Befehle in einer neuen Ebene aus und erstellt ein neues Image. Es wird beispielsweise häufig zum Installieren von Softwarepaketen verwendet.
  • CMD legt Standardbefehle und/oder -parameter fest, die von der Befehlszeile überschrieben werden können, wenn der Docker-Container ausgeführt wird.
  • ENTRYPOINT konfiguriert einen Container, der als ausführbare Datei ausgeführt wird.

Ich bin kein Docker-Experte, habe es aber ein paar Mal bei meiner Arbeit verwendet und verfüge daher über ein gewisses Grundverständnis. Ich denke, der Grund, warum dies funktioniert, liegt an der Schichtung und, was noch wichtiger ist, daran, dass das Sourcing von Umgebungsvariablen rein im Bereich des Speichers erfolgt und nicht auf der Festplatte gespeichert wird. Das Sourcing unter einem RUN bewirkt also eigentlich nichts. Sie müssen sie zum Zeitpunkt der Ausführung Ihrer eigentlichen Anwendung sourcingen, weshalb der obige ENTRYPOINT-Fix funktioniert, weil wir BASH aufrufen, die Variablen in die Umgebung sourcingen und dann Ihre Python-Anwendung zum Ausführungszeitpunkt unter derselben Shell soforken.

Dies erklärt jedoch immer noch nicht, warum es in Ihrer Windows-Umgebung funktioniert. Ich vermute, dass Sie die Umgebungsvariablen irgendwo in Ihrer Windows-Umgebung festgelegt haben, sodass es bei Ihnen funktioniert hat, aber nicht aus dem von Ihnen vermuteten Grund.

verwandte Informationen