在 Docker Compose 中让 InfluxDB 容器启动时自动创建数据库和账号密码,可以通过 环境变量初始化脚本 来实现。以下是几种方法:

🐳 方法一:使用环境变量(推荐)

docker-compose.yml

version: '3.8'

services:
  influxdb:
    image: influxdb:2.7
    container_name: influxdb
    ports:
      - "8086:8086"
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=admin
      - DOCKER_INFLUXDB_INIT_PASSWORD=adminpassword
      - DOCKER_INFLUXDB_INIT_ORG=myorg
      - DOCKER_INFLUXDB_INIT_BUCKET=mybucket
      - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=mytoken
    volumes:
      - influxdb_data:/var/lib/influxdb2

volumes:
  influxdb_data:

🐳 方法二:InfluxDB 1.8 版本(创建数据库)

docker-compose.yml

version: '3.8'

services:
  influxdb:
    image: influxdb:1.8
    container_name: influxdb
    ports:
      - "8086:8086"
    environment:
      - INFLUXDB_DB=mydatabase
      - INFLUXDB_ADMIN_USER=admin
      - INFLUXDB_ADMIN_PASSWORD=adminpassword
      - INFLUXDB_USER=user
      - INFLUXDB_USER_PASSWORD=userpassword
    volumes:
      - influxdb_data:/var/lib/influxdb
      - ./init-influxdb.sh:/docker-entrypoint-initdb.d/init-influxdb.sh

volumes:
  influxdb_data:

init-influxdb.sh(初始化脚本)

#!/bin/bash
set -e

# 等待InfluxDB启动
sleep 10

# 创建额外的数据库和用户
influx -username admin -password adminpassword -execute "
CREATE DATABASE mydatabase;
CREATE USER user WITH PASSWORD 'userpassword';
GRANT ALL ON mydatabase TO user;
"

🐳 方法三:使用自定义入口脚本

docker-compose.yml

version: '3.8'

services:
  influxdb:
    image: influxdb:2.7
    container_name: influxdb
    ports:
      - "8086:8086"
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=admin
      - DOCKER_INFLUXDB_INIT_PASSWORD=adminpassword
      - DOCKER_INFLUXDB_INIT_ORG=myorg
      - DOCKER_INFLUXDB_INIT_BUCKET=mybucket
    volumes:
      - influxdb_data:/var/lib/influxdb2
      - ./setup-influxdb.sh:/docker-entrypoint-initdb.d/setup-influxdb.sh

volumes:
  influxdb_data:

setup-influxdb.sh(InfluxDB 2.x 初始化脚本)

#!/bin/bash
set -e

# 等待InfluxDB完全启动
echo "等待InfluxDB启动..."
sleep 15

# 使用influx CLI进行额外配置
influx setup --skip-verify --force \
  --host http://localhost:8086 \
  --org myorg \
  --bucket mybucket \
  --username admin \
  --password adminpassword \
  --token mytoken

# 创建额外的bucket
influx bucket create --name monitoring --org myorg

# 创建额外的用户(如果需要)
# influx user create --name user --password userpassword --org myorg

🐳 方法四:完整的生产环境配置

docker-compose.yml

version: '3.8'

services:
  influxdb:
    image: influxdb:2.7
    container_name: influxdb
    ports:
      - "8086:8086"
    environment:
      # 初始化配置
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=admin
      - DOCKER_INFLUXDB_INIT_PASSWORD=adminpassword123
      - DOCKER_INFLUXDB_INIT_ORG=mycompany
      - DOCKER_INFLUXDB_INIT_BUCKET=default
      - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=my-super-secret-token
      
      # 其他配置
      - INFLUXDB_HTTP_LOG_ENABLED=false
      - INFLUXDB_LOGGING_LEVEL=error
    volumes:
      - influxdb_data:/var/lib/influxdb2
      - ./init-script.sh:/docker-entrypoint-initdb.d/init-script.sh
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8086/health"]
      interval: 30s
      timeout: 10s
      retries: 3

volumes:
  influxdb_data:

init-script.sh

#!/bin/bash
set -e

echo "等待InfluxDB服务启动..."
# 等待InfluxDB完全启动
while ! curl -s http://localhost:8086/health >/dev/null; do
  sleep 2
done

echo "InfluxDB已启动,执行初始化脚本..."
sleep 5

# 配置InfluxDB
influx config create --config-name default \
  --host-url http://localhost:8086 \
  --org mycompany \
  --token my-super-secret-token \
  --active

# 创建额外的bucket
influx bucket create --name app_metrics --org mycompany --retention 30d
influx bucket create --name system_metrics --org mycompany --retention 7d

# 创建读写token
influx auth create --org mycompany --read-bucket app_metrics --write-bucket app_metrics --description "App Metrics Token"
influx auth create --org mycompany --read-bucket system_metrics --write-bucket system_metrics --description "System Metrics Token"

echo "初始化完成!"

🔧 验证配置是否生效

检查容器状态

docker-compose up -d
docker logs influxdb

测试连接

# InfluxDB 1.8
curl -G 'http://localhost:8086/query' --data-urlencode "u=admin" --data-urlencode "p=adminpassword" --data-urlencode "q=SHOW DATABASES"

# InfluxDB 2.x
curl http://localhost:8086/api/v2/buckets -H "Authorization: Token my-super-secret-token"

💡 重要提示

  1. 版本区别

    • InfluxDB 1.8:使用 INFLUXDB_DB, INFLUXDB_ADMIN_USER 等环境变量
    • InfluxDB 2.x:使用 DOCKER_INFLUXDB_INIT_* 环境变量
  2. 数据持久化:一定要配置 volumes 防止数据丢失

  3. 初始化顺序:InfluxDB 需要时间启动,脚本中要添加等待时间

  4. 安全性:在生产环境中使用强密码和复杂token

推荐使用方法一,这是最简洁和官方推荐的方式。根据您的 InfluxDB 版本选择合适的配置方法。

是的!InfluxDB 1.8 版本可以通过环境变量默认创建数据库。以下是完整的配置方法:

🐳 方法一:使用环境变量(最简单)

docker-compose.yml

version: '3.8'

services:
  influxdb:
    image: influxdb:1.8
    container_name: influxdb-1.8
    ports:
      - "8086:8086"
    environment:
      # 必选:管理员账号
      - INFLUXDB_ADMIN_USER=admin
      - INFLUXDB_ADMIN_PASSWORD=adminpassword
      
      # 可选:创建数据库
      - INFLUXDB_DB=mydatabase
      
      # 可选:创建普通用户
      - INFLUXDB_USER=myuser
      - INFLUXDB_USER_PASSWORD=userpassword
      
      # 其他配置
      - INFLUXDB_HTTP_AUTH_ENABLED=true
    volumes:
      - influxdb_data:/var/lib/influxdb

volumes:
  influxdb_data:

🐳 方法二:使用初始化脚本(更灵活)

docker-compose.yml

version: '3.8'

services:
  influxdb:
    image: influxdb:1.8
    container_name: influxdb-1.8
    ports:
      - "8086:8086"
    environment:
      - INFLUXDB_ADMIN_USER=admin
      - INFLUXDB_ADMIN_PASSWORD=adminpassword
      - INFLUXDB_HTTP_AUTH_ENABLED=true
    volumes:
      - influxdb_data:/var/lib/influxdb
      - ./init-influxdb.sh:/docker-entrypoint-initdb.d/init-influxdb.sh

volumes:
  influxdb_data:

init-influxdb.sh

#!/bin/bash
set -e

echo "等待InfluxDB启动..."
# 等待InfluxDB服务完全启动
sleep 10

# 创建多个数据库
influx -username admin -password adminpassword -execute "
CREATE DATABASE bisheng;
CREATE DATABASE monitoring;
CREATE DATABASE analytics;

-- 创建只读用户
CREATE USER reader WITH PASSWORD 'readonlypassword';
GRANT READ ON bisheng TO reader;
GRANT READ ON monitoring TO reader;

-- 创建读写用户
CREATE USER writer WITH PASSWORD 'writepassword';
GRANT ALL ON bisheng TO writer;
GRANT ALL ON analytics TO writer;

-- 显示所有数据库
SHOW DATABASES;

-- 显示用户权限
SHOW GRANTS FOR reader;
SHOW GRANTS FOR writer;
"

echo "数据库和用户初始化完成!"

🐳 方法三:完整的生产配置

docker-compose.yml

version: '3.8'

services:
  influxdb:
    image: influxdb:1.8
    container_name: influxdb-1.8
    ports:
      - "8086:8086"
    environment:
      # 管理员账户
      - INFLUXDB_ADMIN_USER=admin
      - INFLUXDB_ADMIN_PASSWORD=StrongPassword123!
      
      # 默认数据库
      - INFLUXDB_DB=bisheng
      
      # 用户配置
      - INFLUXDB_USER=app_user
      - INFLUXDB_USER_PASSWORD=AppUserPassword456!
      
      # 认证配置
      - INFLUXDB_HTTP_AUTH_ENABLED=true
      
      # 性能配置
      - INFLUXDB_CACHE_MAX_MEMORY_SIZE=1024m
      - INFLUXDB_QUERY_LOG_ENABLED=false
    volumes:
      - influxdb_data:/var/lib/influxdb
      - ./init-scripts/:/docker-entrypoint-initdb.d/
    healthcheck:
      test: ["CMD", "influx", "-username", "admin", "-password", "StrongPassword123!", "-execute", "SHOW DATABASES"]
      interval: 30s
      timeout: 10s
      retries: 3

volumes:
  influxdb_data:

init-scripts/01-create-databases.sh

#!/bin/bash
set -e

# 等待InfluxDB启动
until curl -s "http://localhost:8086/ping" >/dev/null; do
  sleep 1
done

sleep 3

# 创建多个数据库和用户
influx -username admin -password 'StrongPassword123!' -execute "
-- 创建业务数据库
CREATE DATABASE bisheng
CREATE DATABASE bisheng WITH DURATION 90d REPLICATION 1 SHARD DURATION 7d

-- 创建监控数据库
CREATE DATABASE monitoring
CREATE DATABASE monitoring WITH DURATION 30d

-- 创建日志数据库
CREATE DATABASE logs WITH DURATION 7d

-- 创建只读用户
CREATE USER read_only WITH PASSWORD 'ReadOnly789!'
GRANT READ ON bisheng TO read_only
GRANT READ ON monitoring TO read_only

-- 创建写入用户
CREATE USER write_only WITH PASSWORD 'WriteOnly789!'
GRANT WRITE ON bisheng TO write_only
GRANT WRITE ON monitoring TO write_only

-- 创建管理员用户
CREATE USER operator WITH PASSWORD 'Operator789!'
GRANT ALL ON bisheng TO operator
GRANT ALL ON monitoring TO operator

-- 创建保留策略
CREATE RETENTION POLICY one_week ON bisheng DURATION 7d REPLICATION 1 DEFAULT
CREATE RETENTION POLICY one_month ON monitoring DURATION 30d REPLICATION 1

-- 显示创建结果
SHOW DATABASES
SHOW USERS
SHOW GRANTS
"

echo "✅ InfluxDB 1.8 初始化完成"

🔍 验证数据库创建

检查数据库是否创建成功

# 进入容器检查
docker exec -it influxdb-1.8 influx -username admin -password adminpassword -execute "SHOW DATABASES"

# 或者使用curl
curl -G "http://localhost:8086/query" \
  --data-urlencode "u=admin" \
  --data-urlencode "p=adminpassword" \
  --data-urlencode "q=SHOW DATABASES"

测试用户权限

# 测试只读用户
curl -G "http://localhost:8086/query" \
  --data-urlencode "u=reader" \
  --data-urlencode "p=readonlypassword" \
  --data-urlencode "q=SHOW SERIES ON bisheng"

# 测试读写用户
curl -X POST "http://localhost:8086/write?db=bisheng&u=writer&p=writepassword" \
  -d "cpu,host=server01 value=0.64"

💡 重要提示

  1. 认证必须开启INFLUXDB_HTTP_AUTH_ENABLED=true 否则用户权限无效

  2. 初始化顺序:InfluxDB 需要时间启动,脚本中要添加等待

  3. 数据持久化:一定要配置 volumes,否则数据重启会丢失

  4. 版本确认:确保使用 influxdb:1.8 镜像标签

  5. 权限管理:建议为不同用途创建不同的数据库和用户

✅ 推荐方案

对于简单需求:使用方法一,直接使用环境变量创建数据库

对于复杂需求:使用方法二,使用初始化脚本创建多个数据库和用户权限

这样启动后,InfluxDB 1.8 就会自动创建好数据库和用户账号了!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐