【问题标题】:InfluxDB refusing connectionsInfluxDB 拒绝连接
【发布时间】:2020-10-06 13:29:51
【问题描述】:

我正在使用 influxDB。我的要求是我必须编辑 init-influxdb.sh 文件并在该文件末尾添加一个小脚本。我的 init-influxdb.sh 文件代码是:

#!/bin/bash
set -e

AUTH_ENABLED="$INFLUXDB_HTTP_AUTH_ENABLED"

INIT_USERS=$([ ! -z "$AUTH_ENABLED" ] && [ ! -z "$INFLUXDB_ADMIN_USER" ] && echo 1 || echo)

if [ -z "$INFLUXDB_META_DIR" ]; then
    META_DIR="/var/lib/influxdb/meta"
else
    META_DIR="$INFLUXDB_META_DIR"
fi

if ( [ ! -z "$INIT_USERS" ] || [ ! -z "$INFLUXDB_DB" ] || [ "$(ls -A /docker-entrypoint-initdb.d 2> /dev/null)" ] ) && [ ! "$(ls -d "$META_DIR" 2>/dev/null)" ]; then

    INIT_QUERY=""
    CREATE_DB_QUERY="CREATE DATABASE $INFLUXDB_DB"

    if [ ! -z "$INIT_USERS" ]; then

        if [ -z "$INFLUXDB_ADMIN_PASSWORD" ]; then
            INFLUXDB_ADMIN_PASSWORD="$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c32;echo;)"
            echo "INFLUXDB_ADMIN_PASSWORD:$INFLUXDB_ADMIN_PASSWORD"
        fi

        INIT_QUERY="CREATE USER \"$INFLUXDB_ADMIN_USER\" WITH PASSWORD '$INFLUXDB_ADMIN_PASSWORD' WITH ALL PRIVILEGES"
    elif [ ! -z "$INFLUXDB_DB" ]; then
        INIT_QUERY="$CREATE_DB_QUERY"
    else
        INIT_QUERY="SHOW DATABASES"
    fi

    INFLUXDB_INIT_PORT="8086"

    INFLUXDB_HTTP_BIND_ADDRESS=127.0.0.1:$INFLUXDB_INIT_PORT INFLUXDB_HTTP_HTTPS_ENABLED=false influxd "$@" &
pid="$!"

    INFLUX_CMD="influx -host 127.0.0.1 -port $INFLUXDB_INIT_PORT -execute "

    for i in {30..0}; do
        if $INFLUX_CMD "$INIT_QUERY" &> /dev/null; then
            break
        fi
        echo 'influxdb init process in progress...'
        sleep 1
    done

    if [ "$i" = 0 ]; then
        echo >&2 'influxdb init process failed.'
        exit 1
    fi

    if [ ! -z "$INIT_USERS" ]; then

        INFLUX_CMD="influx -host 127.0.0.1 -port $INFLUXDB_INIT_PORT -username ${INFLUXDB_ADMIN_USER} -password ${INFLUXDB_ADMIN_PASSWORD} -execute "

        if [ ! -z "$INFLUXDB_DB" ]; then
            $INFLUX_CMD "$CREATE_DB_QUERY"
        fi

        if [ ! -z "$INFLUXDB_USER" ] && [ -z "$INFLUXDB_USER_PASSWORD" ]; then
            INFLUXDB_USER_PASSWORD="$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c32;echo;)"
            echo "INFLUXDB_USER_PASSWORD:$INFLUXDB_USER_PASSWORD"
        fi

        if [ ! -z "$INFLUXDB_USER" ]; then
            $INFLUX_CMD "CREATE USER \"$INFLUXDB_USER\" WITH PASSWORD '$INFLUXDB_USER_PASSWORD'"

            $INFLUX_CMD "REVOKE ALL PRIVILEGES FROM \"$INFLUXDB_USER\""

            if [ ! -z "$INFLUXDB_DB" ]; then
                $INFLUX_CMD "GRANT ALL ON \"$INFLUXDB_DB\" TO \"$INFLUXDB_USER\""
            fi
        fi

        if [ ! -z "$INFLUXDB_WRITE_USER" ] && [ -z "$INFLUXDB_WRITE_USER_PASSWORD" ]; then
            INFLUXDB_WRITE_USER_PASSWORD="$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c32;echo;)"
            echo "INFLUXDB_WRITE_USER_PASSWORD:$INFLUXDB_WRITE_USER_PASSWORD"
        fi

        if [ ! -z "$INFLUXDB_WRITE_USER" ]; then
            $INFLUX_CMD "CREATE USER \"$INFLUXDB_WRITE_USER\" WITH PASSWORD '$INFLUXDB_WRITE_USER_PASSWORD'"
            $INFLUX_CMD "REVOKE ALL PRIVILEGES FROM \"$INFLUXDB_WRITE_USER\""

            if [ ! -z "$INFLUXDB_DB" ]; then
                $INFLUX_CMD "GRANT WRITE ON \"$INFLUXDB_DB\" TO \"$INFLUXDB_WRITE_USER\""
            fi
        fi

        if [ ! -z "$INFLUXDB_READ_USER" ] && [ -z "$INFLUXDB_READ_USER_PASSWORD" ]; then
            INFLUXDB_READ_USER_PASSWORD="$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c32;echo;)"
            echo "INFLUXDB_READ_USER_PASSWORD:$INFLUXDB_READ_USER_PASSWORD"
        fi

        if [ ! -z "$INFLUXDB_READ_USER" ]; then
            $INFLUX_CMD "CREATE USER \"$INFLUXDB_READ_USER\" WITH PASSWORD '$INFLUXDB_READ_USER_PASSWORD'"
            $INFLUX_CMD "REVOKE ALL PRIVILEGES FROM \"$INFLUXDB_READ_USER\""

            if [ ! -z "$INFLUXDB_DB" ]; then
                $INFLUX_CMD "GRANT READ ON \"$INFLUXDB_DB\" TO \"$INFLUXDB_READ_USER\""
            fi
        fi

    fi

    for f in /docker-entrypoint-initdb.d/*; do
        case "$f" in
            *.sh)     echo "$0: running $f"; . "$f" ;;
            *.iql)    echo "$0: running $f"; $INFLUX_CMD "$(cat ""$f"")"; echo ;;
            *)        echo "$0: ignoring $f" ;;
        esac
        echo
    done

    if ! kill -s TERM "$pid" || ! wait "$pid"; then
        echo >&2 'influxdb init process failed. (Could not stop influxdb)'
        exit 1
    fi

fi
# My custom script starts here
INIT_QUERY="CREATE USER \"$INFLUXDB_ADMIN_USER\" WITH PASSWORD '$INFLUXDB_ADMIN_PASSWORD' WITH ALL PRIVILEGES"

INFLUXDB_INIT_PORT="8086"

INFLUX_CMD="influx -host 127.0.0.1 -port $INFLUXDB_INIT_PORT -username admin -password admin -execute "

echo 'Creating admin user of influx db'
$INFLUX_CMD "$INIT_QUERY"
echo 'Admin user of influx db created successfully'

echo 'Enabling authentication on influxdb server'
if [ -z "$AUTH_ENABLED" ]; then
    AUTH_ENABLED="$(grep -iE '^\s*auth-enabled\s*=\s*true' /etc/influxdb/influxdb.conf | grep -io 'true' | cat)"
else
    AUTH_ENABLED="$(echo "$INFLUXDB_HTTP_AUTH_ENABLED" | grep -io 'true' | cat)"
fi

问题是,在打印“Creating admin user of influx db”后,我收到错误“Failed to connect to http://localhost:8086: Get http://localhost :8086/ping: 拨号 tcp [::1]:8086: getsockopt 请检查您的连接设置并确保 'influxd' 正在运行。"

这可能是什么问题?任何其他查询都没有任何错误。为什么我收到此错误。我被卡住了,任何帮助将不胜感激。

我的 DockerFile 是:

FROM influxdb:1.7.6


ENV INFLUXDB_ADMIN_USER="admin"
ENV INFLUXDB_ADMIN_PASSWORD="admin"
ENV INFLUXDB_HTTP_AUTH_ENABLED=true
ENV TZ=America/Los_Angeles

RUN chmod +x entrypoint.sh

RUN chmod 777 /init-influxdb.sh

COPY init-influxdb.sh /

RUN chmod 777 /init-influxdb.sh

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

【问题讨论】:

  • 你在哪里使用这个脚本?
  • 这个文件“init-influxdb.sh”在容器启动(运行)时自动运行@Stefano
  • 我在提问之前阅读了这两项更改。

标签: linux docker shell influxdb


【解决方案1】:

我认为问题是当您尝试运行该语句时数据库尚未启动。

检查脚本的其余部分,您可以看到他们对问题的解决方案:

    for i in {30..0}; do
        if $INFLUX_CMD "$INIT_QUERY" &> /dev/null; then
            break
        fi
        echo 'influxdb init process in progress...'
        sleep 1
    done

    if [ "$i" = 0 ]; then
        echo >&2 'influxdb init process failed.'
        exit 1
    fi

我认为您的设置不涉及执行该部分脚本。

【讨论】:

  • 嗯,这不是解决方案。如果“ADMIN”用户已经存在,那么上述循环将永远不会中断。只有当“ADMIN”用户不存在@Stefano 时,循环才会中断。顺便说一句,这是您发布的脚本的默认代码。
  • 好吧,当脚本到达那里时,显然数据库没有回答。否则为什么要在中间重复这个循环 30 次 sleep 1
  • 您发布的代码处于 if 条件下,即 "if ( [ ! -z "$INIT_USERS" ] || [ ! -z "$INFLUXDB_DB" ] || [ "$(ls - A /docker-entrypoint-initdb.d 2> /dev/null)" ] ) && [ !"$(ls -d "$META_DIR" 2>/dev/null)" ]; 那么...如果数据库已经存在那么脚本将永远不会进入 if 块并直接进入我的自定义脚本。如果我将您发布的代码放在我的自定义脚本中并且 ADMIN 用户已经存在,它永远不会打破循环@Stefano“
  • 你在说什么? break 正是出于这个原因。无论如何,我的观点是,您的脚本部分没有处理数据库尚未准备好收听任何命令的可能性。
  • 当 if 条件变为真且 if 条件不变为真时,代码将中断 @Stefano
猜你喜欢
  • 1970-01-01
  • 2020-02-03
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多