在Docker Compose中初始化Postgres数据库

时间:2019-06-18 07:36:47

标签: postgresql docker docker-compose

我有以下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容器?

1 个答案:

答案 0 :(得分:0)

我设法使用自定义label total works = "result from SQL query Nr 1" label paused works = "result from SQL query Nr 2" label canceled works = "result from SQL query Nr 3" 使它正常工作,这是我的解决方案:

项目结构

Dockerfile

文件

  1. data/ datasource.csv db/ scripts/ 1_init.sql 2_copy.sql Dockerfile docker-compose.yml 文件位于项目内部的CSV文件夹中。
  2. 在项目文件夹中,有以下data文件:

    docker-compose.yml
  3. 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
  4. FROM postgres:alpine COPY *.sql /docker-entrypoint-initdb.d/ 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
  5. CREATE TABLE table_name ( --statement body );

    2_copy.sql

说明

COPY table_name FROM '/data/datasource.csv' DELIMITER ',' CSV HEADER; 创建数据库表,它必须具有与CSV文件中相同的列名1_init.sql负责将数据从CSV复制到Postgres。

2_copy.sql使用postgres图像并将所有Dockerfile文件复制到*.sql。后来,所有文件都按字母数字顺序执行,这就是/docker-entrypoint-initdb.d/文件以数字开头的原因。最后,端口*.sql被暴露。

6666docker-compose.yml文件夹构建Dockerfile,并使其可通过db端口访问。作为环境性质,使用基本的postgres性质。然后将带有CSV文件的5431文件夹复制到容器中。