3

Title is not entirely accurate, I'm open for suggestions!

You can find a full MCVE here: https://github.com/timstoop/20170614-python-docker-influxdb-problem

Tested with:

  • docker-engine 17.05.0~ce-0~ubuntu-xenial
  • docker-compose version 1.13.0, build 1719ceb

So the docker-compose starts an influxdb and a small python3 app. The only thing the app does is try to connect to influxdb, run a command and if that fails, wait 5 seconds and try again. If I run docker-compose up on this code, the app will never connect, it keeps retrying. These are the log lines it outputs:

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.

However, if I open a shell in that specific container using docker exec -ti <container name> /bin/sh, the following works fine:

/ # 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'}]
>>>

I'm sure I'm overlooking something silly, but I'm unable to explain why the app.py won't make a connection. And thus, I'm unable to fix that connection. Any advise here would be greatly appreciated.

My code, for reference, follows below.

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 <[email protected]>

# 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"]

docker-compose.yml:

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

Please let me know if you need any additional information!

2
  • i think you trying to connect to wrong endpoint. Let me show please log output for this lines : output('Trying InfluxDB connection...') output("Influx host: %s" % influx_host) output("Influx port: %s" % influx_port) Also please try to execute python3 -u /app.py manually (inside app container). Commented Jun 14, 2017 at 18:49
  • Added the output of the log lines to my question. And you're right, when I run the script via the exec in the container, it gives me the same output. But I don't understand why, as my manual invocation of InfluxDBClient seems to be exactly the same? Commented Jun 14, 2017 at 19:00

1 Answer 1

3

Remove quotes from docker-compose.yml file in environment section.

environment:
  - INFLUX_HOST=influxdb
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.