问题描述
我正在尝试将 Datadog APM 跟踪和日志收集集成到在 Docker 上运行的 Python 应用程序。 在 Dockerfile 中,我需要激活 conda 虚拟环境并导出一个环境 DD_AGENT_HOST。
FROM continuumio/miniconda3
workdir /app
copY src ./src
copY application.yaml .
copY wsgi.py .
copY gunicorn.conf.py .
copY logging.ini .
RUN conda env create -f application.yaml
SHELL ["conda","run","-n","dd_venv","/bin/bash","-c"]
ENTRYPOINT ["conda","--no-capture-output","ddtrace-run","gunicorn","-c","gunicorn.conf.py","wsgi:app","--preload"]
我可以使用上述 Dockerfile 运行应用程序。但是,应用程序需要导出环境 DD_AGENT_HOST 才能与 Datadog 连接,并且必须通过 HTTP 请求检索 DD_AGENT_HOST 的值。
ENTRYPOINT ["conda","export DD_AGENT_HOST=$(wget <ip_ddress>)","--preload"]
我尝试将 export 命令添加到 ENTRYPOINT 如上所述,这导致 Docker 运行失败并出现错误 "导出 DD_AGENT_HOST=: 未找到命令:.
实现这一目标的正确方法是什么?
解决方法
由于您通过激活的 Conda 环境运行它,因此应该可以将激活脚本添加到包含该命令的环境中。例如,像这样的文件:
/path/to/envs/dd_venv/etc/conda/activate.d/env_vars.sh
#!/bin/sh
export DD_AGENT_HOST=$(wget <ip_address>)
见the documentation on Saving Environment Variables。
请注意,对于静态环境变量(例如,您先验知道的字符串),这些可以直接集成到您的 application.yaml 文件中。见the documentation on Setting Environment Variables。
,我通过使用CMD的shell形式并结合导出环境变量的命令和启动应用程序的命令来解决这个问题。
CMD export DD_AGENT_HOST=$(wget <ip_address>); ddtrace-run gunicorn -c gunicorn.conf.py wsgi:app --preload
我必须在 SHELL 中添加 --no-capture-output
才能将日志写入 sdout
和 stderr
。
SHELL ["conda","run","--no-capture-output","-n","dd_venv","/bin/bash","-c"]