【发布时间】:2021-03-17 15:01:10
【问题描述】:
我有一个奇怪的情况,我有一个 secret.env 文件,我在其中设置了所有环境变量:
secret.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 上运行它时,它工作正常!
有人可以帮我吗?
【问题讨论】:
-
stackoverflow.com/questions/39597925/… 有帮助吗?您似乎打算使用内置的 Dockerfile 功能为 Docker 会话设置环境变量。
-
你可以按照docs.docker.com/engine/reference/commandline/run/…使用
docker run --env-file secret.env ... -
@Karl 这看起来不错,但是如果我在我的 dockerfile 中设置我的密钥,并且当我将它推送到 Github 时,它将对公众可见,这可能是一个问题
-
RUN source ...永远不会设置超出当前RUN步骤的环境变量;见How to source a script with environment variables in a docker build process?。但是,对于无法包含在图像中的凭据,您将需要 @jakub 建议的docker run --env-file之类的东西。 -
@jakub 谢谢你!它工作得很好。如果你把它作为答案,我会接受它:)
标签: python docker environment-variables dockerfile