同Docker容器部署Datadog Agent监控Python应用报无法分配地址求解
问题排查与修复方案
核心错误原因
你当前的配置最大的问题是容器启动时仅运行了Python应用,没有启动Datadog Agent进程,8126端口没有对应的监听服务,所以ddtrace上报链路数据时会抛出无法连接的错误。
你的Dockerfile中CMD指令仅指定了Python应用的启动命令,Datadog Agent安装完成后没有随容器启动,端口映射/暴露操作都没有实际意义。
修复步骤
1. 调整镜像配置,添加进程管理器管理多进程
同一个容器内运行多个进程需要使用进程管理器,这里以supervisor为例,修改Dockerfile如下:
FROM ubuntu:18.04 WORKDIR /app RUN apt-get update --no-install-recommends RUN apt-get install -y build-essential python3.6 python3.6-dev python3-pip python3-setuptools supervisor --no-install-recommends RUN pip3 install Cython RUN pip3 install ddtrace RUN apt-get install -y curl ADD ./datadog_app.py /app/handler.py RUN DD_AGENT_MAJOR_VERSION=7 DD_SITE="datadoghq.com" bash -c "$(curl -L https://s3.amazonaws.com/dd-agent/scripts/install_script.sh)" # 新增supervisor配置文件导入 COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf # 替换原CMD,启动supervisor管理两个进程 CMD ["/usr/bin/supervisord"]
2. 新增supervisor配置文件
在镜像构建上下文目录下新建supervisord.conf,内容如下:
[supervisord] nodaemon=true logfile=/var/log/supervisord.log pidfile=/var/run/supervisord.pid [program:datadog-agent] command=/opt/datadog-agent/bin/agent/agent run -p /opt/datadog-agent/run/agent.pid user=dd-agent autostart=true autorestart=true stdout_logfile=/var/log/datadog/agent.log stderr_logfile=/var/log/datadog/agent-error.log environment=DD_API_KEY=%(ENV_DD_API_KEY)s,DD_SITE=datadoghq.com [program:python-app] command=ddtrace-run python3 handler.py autostart=true autorestart=false stdout_logfile=/var/log/python/app.log stderr_logfile=/var/log/python/app-error.log
3. 调整容器启动命令
不要把API密钥硬编码在镜像中,启动时通过环境变量传入:
docker run -it -e DD_API_KEY=你的实际Datadog API密钥 datadog_app:v_1
补充说明
- 官方不推荐将Datadog Agent和业务应用放在同一个容器运行,更合理的方案是将Agent作为sidecar容器部署,或者在宿主节点部署Agent共享到业务容器中,维护成本更低,隔离性更好。
- 不需要手动映射/暴露8126端口,同一个容器内的进程可以直接通过本地环回地址通信。
内容的提问来源于stack exchange,提问作者Prateek
相关产品推荐
相关产品推荐

