我正在尝试在 docker 容器中运行 python 应用程序。python 应用程序从文件中获取秘密.env,并dotenv.load_dotenv在 python 中使用来提取秘密。当我在本地运行时,工作得非常好。所以我认为这与在基础映像上运行的 Python 版本有关。 .我已经尝试使用与本地运行完全相同的版本,但仍然失败。
Docker 文件:
FROM python:latest
WORKDIR /casp
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . /casp
ENTRYPOINT [ "python3" ]
CMD [ "main.py" ]
Run Code Online (Sandbox Code Playgroud)
在我的Python应用程序中:
from pathlib import Path
from dotenv import load_dotenv
env_path = Path('.') / '.env'
load_dotenv(dotenv_path=env_path)
Run Code Online (Sandbox Code Playgroud)
我实际上尝试完全放弃这个想法,并恢复到在 using 中传递环境变量,docker run -e但是,事实证明也Flask依赖于dot_env,因此它也在那里失败。
我已经做了相当多的查找,似乎很多人确实遇到了 Docker / Dotenv 问题,但似乎没有一个与此直接匹配。
以前的帖子表明它可能与位置有关,但这里的路径实际上只是./env与容器匹配,因为WORKDIR创建了然后将整个应用程序目录复制到其中,其中包括.env和main.py。
我看到的错误是:
ImportError: cannot import name 'load_dotenv' from 'dotenv' (/usr/local/lib/python3.9/site-packages/dotenv/__init__.py)
当前测试正在使用Python 3.9. 我在本地运行Python 3.85- 我尝试更改Dockerfile以匹配此版本...同样的错误。
编辑:
(venv) root@jon-Blade:/home/jon/PycharmProjects/caspv2# pip freeze | grep dotenv
python-dotenv==0.14.0
(venv) root@jon-Blade:/home/jon/PycharmProjects/caspv2# grep dotenv requirements.txt
python-dotenv==0.14.0
Run Code Online (Sandbox Code Playgroud)
编辑编辑:
root@jon-Blade:~# docker exec 2ce1ff67d74f pip list | grep dotenv
python-dotenv 0.14.0
Run Code Online (Sandbox Code Playgroud)
编辑编辑编辑:
从容器内:
>>> import dotenv
>>> dir(dotenv)
['__author__', '__builtins__', '__cached__', '__doc__', '__email__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_get_line_', 'ast', 'get', 'load', 'os', 'save']
Run Code Online (Sandbox Code Playgroud)
从我的终端的 venv 中:
>>> import dotenv
>>> dir(dotenv)
['IS_TYPE_CHECKING', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'compat', 'dotenv_values', 'find_dotenv', 'get_cli_string', 'get_key', 'load_dotenv', 'load_ipython_extension', 'main', 'parser', 'set_key', 'unset_key']
Run Code Online (Sandbox Code Playgroud)
正如我们所看到的,在容器中它是load,在终端中它是load_dotenv。更重要的是,不一样!使用完全相同的版本requirements.txt
终端:
(venv) jon@jon-Blade:~/PycharmProjects/caspv2$ pip freeze | grep dotenv
python-dotenv==0.14.0
Run Code Online (Sandbox Code Playgroud)
容器:
root@2476f65ffa10:/casp# pip freeze | grep dotenv
python-dotenv==0.14.0
Run Code Online (Sandbox Code Playgroud)
终端版本:
(venv) jon@jon-Blade:~/PycharmProjects/caspv2$ python --version
Python 3.8.5
Run Code Online (Sandbox Code Playgroud)
容器版本:
root@3aa5c393846e:~# python --version
Python 3.8.5
Run Code Online (Sandbox Code Playgroud)
在两者上运行pip show python-dotenv也证实了完全相同的细节,逐行!
这当然很有趣,也很令人困惑……但一定有一些有趣的事情发生。
编辑编辑编辑编辑编辑:)
python-dotenv在我升级到的容器中0.15.0:
root@8a94c1e22b8a:~# pip show python-dotenv | grep -i version
Version: 0.15.0
Run Code Online (Sandbox Code Playgroud)
然而:
>>> import dotenv
>>> dir(dotenv)
['__author__', '__builtins__', '__cached__', '__doc__', '__email__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_get_line_', 'ast', 'get', 'load', 'os', 'save']
Run Code Online (Sandbox Code Playgroud)
它仍然给我错误的包裹。
你的requirement.txt中的dotenv有版本吗?我会在问题下留下评论,但我\xe2\x80\x99m 无法需要更多代表
\npython-dotenv==0.15.0\nRun Code Online (Sandbox Code Playgroud)\n更新:\n查看您的 dir(dotenv),您应该会发现它没有为您提供正确的包,因此首先将您的requirement.txt 中的 python-dotenv 更新为 0.15.0,如我上面所示。\n然后更新
\nFROM python:3.8.5\nENV VIRTUAL_ENV=/opt/venv\nRUN python3 -m venv $VIRTUAL_ENV\nENV PATH="$VIRTUAL_ENV/bin:$PATH"\n\n# Install dependencies:\nWORKDIR /casp\nCOPY requirements.txt /casp/\nRUN pip install -r /casp/requirements.txt\n\n# Run the application:\nCOPY . /casp /casp\nCMD ["python3", "main.py"]\nRun Code Online (Sandbox Code Playgroud)\n主要问题是您的容器无法访问 python-dotenv,即使您正在安装它。如果这不起作用,请 docker 销毁并重建容器。我已经在本地完成了此操作,并且我有一个工作的 docker 容器。\n如果它可以加快您的开发速度,您可以通过这种方式添加 ENV 变量。
\n环境管理员=“杰克”
\n您可以使用以下方式访问它
\nimport os\nadmin_name = os.environ['ADMIN']\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
5687 次 |
| 最近记录: |