我有一个奇怪的情况,我有一个 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 上运行它时,它工作正常!
有人可以帮我吗?
将最后一行更改为:
相反,并删除
RUN
您执行采购的位置。另请参阅https://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/了解和之间RUN
的区别。CMD
ENTRYPOINT
我不是 docker 专家,但在我的工作中使用过几次,所以对它有一些基本的了解。我认为这个工作的原因是因为分层,更重要的是,因为获取环境变量的行为纯粹是在内存领域,而不是存储在磁盘上。因此,在 RUN 下采购实际上并没有实现任何目标。您需要在执行实际应用程序时获取它们,这就是上述 ENTRYPOINT 修复工作的原因,因为我们正在调用 BASH,将变量获取到环境中,然后分叉您的 python 应用程序,所有这些都在同一个 shell 下,在执行时。
但是,这仍然不能解释为什么它在您的 Windows 环境中工作 - 我怀疑您在 Windows 环境中的某个位置设置了环境变量,所以这对您有用,但不是您认为的原因。