Dockerfile构建TimescaleDB容器时psql无法连接问题
问题根源
Dockerfile里的RUN指令是在镜像构建阶段执行的,这时候PostgreSQL/TimescaleDB服务根本没启动,自然找不到socket文件,所以psql连接失败。用wait_for_it.sh也没用,因为构建阶段压根没启动数据库服务。
正确解决方案
PostgreSQL(包括TimescaleDB)官方镜像默认会在容器启动、数据库服务初始化完成后,自动执行/docker-entrypoint-initdb.d/目录下的.sql、.sh脚本,这才是执行初始化SQL的正确时机。
步骤1:修改Dockerfile
把创建表的逻辑放到单独的初始化脚本里,再复制到镜像的指定目录:
# Pull in the latest TimescaleDB image FROM timescale/timescaledb:latest-pg14 # 将初始化脚本复制到镜像的初始化目录 COPY init.sql /docker-entrypoint-initdb.d/
步骤2:编写init.sql脚本
在Dockerfile同目录下创建init.sql文件,写入你的建表语句:
CREATE TABLE IF NOT EXISTS raw_table ( -- 替换成你的实际表结构 id SERIAL PRIMARY KEY, sensor_data NUMERIC, record_time TIMESTAMPTZ DEFAULT NOW() ); -- 如果需要将普通表转为TimescaleDB超表,可添加以下语句 -- SELECT create_hypertable('raw_table', 'record_time');
步骤3:调整docker-compose.yml
之前挂载宿主机/var/run/postgresql的配置完全没必要,直接删掉即可:
db: build: context: 'timescaleDB/' ports: - "5432:5432" environment: - POSTGRES_PASSWORD=password
为什么之前的方法无效?
- 构建阶段执行
RUN psql:此时数据库服务还没启动,根本无法建立连接 - 挂载宿主机socket目录:这个配置是给宿主机程序连接容器内数据库用的,和镜像构建、容器初始化无关,完全不解决当前问题
内容的提问来源于stack exchange,提问作者Khabbab Zakaria
相关产品推荐
相关产品推荐

