Ubuntu
Python 在導出環境變數時拋出 KeyError
我有一個奇怪的情況,我有一個 secret.env 文件,我在其中設置了所有環境變數:
秘密.env
export TWITTER_CONSUMER_KEY="something" export TWITTER_CONSUMER_SECRET="something"
然後我建構了一個 docker 文件來導出所有變數並像這樣執行應用程序:
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"]
但是,這引發了一個關鍵錯誤:
$ 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'
當我在我的 Windows 上執行它時,它工作正常!
有人可以幫我嗎?
將最後一行更改為:
ENTRYPOINT ["/bin/bash", "-c", "source secret.env ; python run.py"]
相反,並刪除
RUN
您執行採購的位置。另請參閱https://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/了解和之間RUN
的區別。CMD``ENTRYPOINT
簡而言之:
- RUN 在新層中執行命令並創建新圖像。例如,它通常用於安裝軟體包。
- CMD 設置預設命令和/或參數,可以在 docker 容器執行時從命令行覆蓋。
- ENTRYPOINT 配置將作為執行檔執行的容器。
我不是 docker 專家,但在我的工作中使用過幾次,所以對它有一些基本的了解。我認為這個工作的原因是因為分層,更重要的是,因為獲取環境變數的行為純粹是在記憶體領域,而不是儲存在磁碟上。因此,在 RUN 下採購實際上並沒有實現任何目標。您需要在執行實際應用程序時獲取它們,這就是上面的 ENTRYPOINT 修復工作的原因,因為我們正在呼叫 BASH,將變數獲取到環境中,然後分叉您的 python 應用程序,所有這些都在同一個 shell 下,在執行時。
但是,這仍然不能解釋為什麼它在您的 Windows 環境中工作 - 我懷疑您在 Windows 環境中的某個位置設置了環境變數,所以這對您有用,但不是您認為的原因。