python - 更改 docker-compose 文件中 docker 容器中的 PYTHONPATH

标签 python docker docker-compose pythonpath

我在 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。

相反,我尝试了很多方法:

  1. 在 dockerfile 中 ENV PYTHONPATH=$PWD/..
  2. 在 docker-compose.yml 中入口点:["PYTHONPATH=/..","python3", "/crm/maintenance/maintenance.py"]
  3. 在 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/

相关文章:

node.js - NodeJS dockerfile 构建因 NPM 失败

javascript - 无法在Docker容器之间发出HTTP请求

python - 将字符串附加到 numpy ndarray

python - 使用pattern.en 格式化整个文本?

docker - 如何在 github 操作服务容器中运行命令?

python - Docker+Django,服务器运行但欢迎页面不显示

python - 如何获取子进程的 stderr 流输出的最后 N 行?

python - 如何将一列中的每个单元格与 pandas 中的特定值进行比较?

postgresql - Postgres,RHEL和Docker

docker - 无法启动 Elasticsearch ,因为找不到JAVA_HOME