繁体   English   中英

在docker中运行时无法从python连接到influxdb

[英]Cannot connect from python to influxdb when running in docker

标题并不完全准确,我欢迎您提出建议!

您可以在此处找到完整的MCVE: https : //github.com/timstoop/20170614-python-docker-influxdb-problem

经过测试:

  • docker-engine 17.05.0〜ce-0〜ubuntu-xenial
  • docker-compose版本1.13.0,内部版本1719ceb

因此,docker-compose启动了一个influxdb和一个小型python3应用。 该应用程序唯一要做的就是尝试连接到influxdb,运行命令,如果失败,请等待5秒钟,然后重试。 如果我在此代码上运行docker-compose up ,该应用将永远不会连接,并会继续重试。 这些是它输出的日志行:

app_1       | 2017-06-14 18:57:36.892955 ticker Trying InfluxDB connection...
app_1       | 2017-06-14 18:57:36.892977 ticker Influx host: 'influxdb'
app_1       | 2017-06-14 18:57:36.892984 ticker Influx port: 8086
app_1       | 2017-06-14 18:57:36.935112 ticker No InfluxDB connection yet. Waiting 5 seconds and retrying.

但是,如果我使用docker exec -ti <container name> /bin/sh在该特定容器中打开外壳,则可以正常工作:

/ # python3 -u
Python 3.6.1 (default, Jun  8 2017, 21:50:56) 
[GCC 6.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from influxdb import InfluxDBClient
>>> ci = InfluxDBClient(host='influxdb')
>>> ci.get_list_database()
[{'name': '_internal'}]
>>>

我确定我忽略了一些愚蠢的事情,但是无法解释为什么app.py无法建立连接。 因此,我无法修复该连接。 任何建议在这里将不胜感激。

我的代码供参考,如下。

app.py:

#!/usr/bin/env python
from influxdb import InfluxDBClient
import datetime
import sys
import time
import os
import requests


def output(msg):
    # Convenience function to always show a correct output
    now = datetime.datetime.now()
    print("%s ticker %s" % (now, msg))


if __name__ == '__main__':
    # Gather our settings
    influx_host = os.getenv('INFLUX_HOST', 'localhost')
    influx_port = os.getenv('INFLUX_PORT', '8086')
    influx_user = os.getenv('INFLUX_USER', 'root')
    influx_pass = os.getenv('INFLUX_PASS', 'root')
    # Create our connections
    # Check to make sure we can create a connection
    got_if_connection = False
    while not got_if_connection:
        output('Trying InfluxDB connection...')
        output("Influx host: %s" % influx_host)
        output("Influx port: %s" % influx_port)
        influx_client = InfluxDBClient(host=influx_host, port=influx_port,
                                       username=influx_user,
                                       password=influx_pass)
        try:
            influx_client.get_list_database()
        except requests.exceptions.ConnectionError:
            output('No InfluxDB connection yet. Waiting 5 seconds and '+
                   'retrying.')
            time.sleep(5)
        else:
            got_if_connection = True

Dockerfile:

FROM python:alpine3.6
MAINTAINER Tim Stoop <tim@kumina.nl>

# Copy the script in
COPY app.py /app.py
COPY requirements.txt /requirements.txt

# Install dependencies
RUN pip install -r /requirements.txt


CMD ["python3", "-u", "/app.py"]

泊坞窗,compose.yml:

version: '2'
services:
  influxdb:
    image: "influxdb:alpine"
    ports:
      - "8086:8086"
  app:
    build: .
    links:
      - influxdb
    environment:
      - INFLUX_HOST='influxdb'

如果您需要任何其他信息,请告诉我!

在环境部分删除docker-compose.yml文件中的引号。

environment:
  - INFLUX_HOST=influxdb

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM