postgresql - 在 Docker Compose 中初始化 Postgres 数据库
问题描述
我有以下docker-compose.yml
文件:
version: '3'
services:
postgres:
image: postgres
container_name: postgres
ports:
- "5431:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=anime
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
此配置启动 Postgres 数据库。在卷中我定义了 init.sql,它应该建立一个表:
CREATE TABLE anime (
anime_id INT PRIMARY KEY,
title TEXT
);
然后,我想用 CSV 文件中的数据填充 Postgres 数据库。
我尝试向 docker-compose 添加另一个卷:
- ./preload.sql:/preload/preload.sql
使用该脚本:
copy anime FROM 'docker/data/AnimeList.csv' DELIMITER ',' CSV HEADER;
CSV 文件位于data
文件夹中,与docker-compose.yml
.
但它不起作用。数据库已正确创建,但没有表和数据。当我连接到 Docker 容器,运行'psql
命令并尝试获取anime
表时,我收到以下错误:
Did not find any relation named "anime".
我的问题是:如何在 docker-compose 中使用 CSV 数据文件预加载 Postgres 容器?
解决方案
我设法使用 custom 使其工作Dockerfile
,这是我的解决方案:
项目结构
data/
datasource.csv
db/
scripts/
1_init.sql
2_copy.sql
Dockerfile
docker-compose.yml
文件
CSV
文件位于data
项目内的文件夹中。在项目文件夹中有以下
docker-compose.yml
文件:version: '3.3' services: db: build: ./db container_name: postgres ports: - "5431:6666" environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=db_name volumes: - ./data:/data
Dockerfile
包含:FROM postgres:alpine ADD scripts/1_init.sql /docker-entrypoint-initdb.d ADD scripts/2_copy.sql /docker-entrypoint-initdb.d RUN chmod a+r /docker-entrypoint-initdb.d/* EXPOSE 6666
1_init.sql
身体:CREATE TABLE table_name ( --statement body );
并且
2_copy.sql
:COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER;
解释
1_init.sql
创建数据库表,它必须具有与 CSV 文件中相同的列名。2_copy.sql
负责将数据从 CSV 复制到 postgres。
Dockerfile
使用 postgres 图像并将所有*.sql
文件复制到/docker-entrypoint-initdb.d/
. 后来,所有文件都按字母数字顺序执行,这就是*.sql
文件以数字开头的原因。最后,端口6666
被暴露。
docker-compose.yml
构建Dockerfile
fromdb
文件夹并使其可通过5431
端口访问。使用基本的 postgres 属性作为环境属性。最后,data
带有 CSV 文件的文件夹被复制到容器中。
推荐阅读
- shopify - 如何在 shopify 中创建自定义模块(CRUD)?喜欢,产品和导航
- sql - 多行的 SQL 查询
- node.js - npm install bcrypt@3.0.6 使用节点 6.12.1 失败
- sql-server - 使用一个表中的 id 连接 4 个表并为 2 个表求和数量
- php - 如何通过 jQuery AJAX 将 php 变量拉入 js 对象的属性中?
- kubernetes - 如何获取部署在 Kubernetes 中的应用程序的延迟?
- algorithm - 如何在有效的时间内解决 Kakurasu Puzzle?
- ios - 在 Swift 中创建常量文件的最佳方法是什么?请检查说明
- bit - 什么是位设置“高”?简单解释
- android - 如何获取连接在同一网络中的主机的操作系统名称