我在 Docker 容器中有一个应用程序,其入口点定义为
ENTRYPOINT ["/usr/local/bin/gunicorn", "--pythonpath=`$PWD`/.."]
然后,我有三个容器进程,它们使用该容器和入口点从应用程序提供我的文件。那里一切都很好。
我现在正在尝试启动另一个覆盖 gunicorn
命令的容器进程。我希望它使用命令运行 python3
进程
entrypoint: ["python3", "/crm/maintenance/maintenance.py"]
在docker-compose.yml
文件中。
问题是,当我使用上述入口点运行 docker-compose up -d 时,除了运行 python 进程的容器外,所有容器都运行良好。
我得到的错误是:
Traceback (most recent call last):
File "/crm/maintenance/maintenance.py", line 6, in <module>
from crm.sms_system.answer_send import AnswerSender
ImportError: No module named 'crm'
我将此错误归因于仍然不正确的 python 路径。对于 docker 文件中定义的入口点,我有 "--pythonpath=
$PWD/.."
标志。但这不能转移到 python3。
相反,我尝试了很多方法:
- 在 dockerfile 中
ENV PYTHONPATH=$PWD/..
- 在 docker-compose.yml 中
入口点:["PYTHONPATH=/..","python3", "/crm/maintenance/maintenance.py"]
- 在 docker-compose.yml 中
入口点:["PYTHONPATH=$PWD/..","python3", "/crm/maintenance/maintenance.py"]
。这不起作用,因为 PWD 是从运行 docker-compose up 命令的位置执行的,而不是在容器中。
如何在运行时从 docker-compose 文件更改容器中的 PYTHONPATH?
最佳答案
需要使用$$
来转义docker-compose的环境变量解析。这是一个对我有用的示例文件
version: '2'
services:
python:
image: python:3.6
working_dir: /usr/local
command: bash -c "PYTHONPATH=$$PWD/.. python3 -c 'import sys; print(sys.path)'"
$ docker-compose up
Recreating test_python_1
Attaching to test_python_1
python_1 | ['', '/usr', '/usr/local/lib/python36.zip', '/usr/local/lib/python3.6', '/usr/local/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/site-packages']
test_python_1 exited with code 0
关于python - 更改 docker-compose 文件中 docker 容器中的 PYTHONPATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45455703/