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

标题不完全准确,我愿意提供build议!

你可以在这里find一个完整的MCVE: https : //github.com/timstoop/20170614-python-docker-influxdb-problem

经testing:

  • docker-engine 17.05.0〜ce-0〜ubuntu-xenial
  • docker构成版本1.13.0,构build1719ceb

所以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在特定容器中打开一个shell,以下工作正常:

 / # 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不能build立连接。 因此,我无法解决这个问题。 任何意见在这里将不胜感激。

我的代码,供参考,如下所示。

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