Ubuntu

Python 在導出環境變數時拋出 KeyError

  • December 6, 2020

我有一個奇怪的情況,我有一個 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 環境中的某個位置設置了環境變數,所以這對您有用,但不是您認為的原因。

引用自:https://serverfault.com/questions/1045154