【问题标题】:Initialize Postgres db in Docker Compose在 Docker Compose 中初始化 Postgres 数据库
【发布时间】:2019-06-18 07:36:47
【问题描述】:

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

【问题讨论】:

  • 你有什么错误吗?你能分享你正在使用的最终 docker-compose.yml 文件吗?
  • 请不要将解决方案添加到您的问题中。使用该解决方案添加答案并接受该答案。否则你的问题将保持“开放”

标签: postgresql docker docker-compose


【解决方案1】:

我设法使用自定义 Dockerfile 使其工作,这是我的解决方案:

项目结构

data/
  datasource.csv
db/
  scripts/
    1_init.sql
    2_copy.sql
  Dockerfile
docker-compose.yml

文件

  1. CSV 文件位于项目内部的data 文件夹中。

  2. 在项目文件夹中有如下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
    
  3. 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
    
  4. 1_init.sql正文:

    CREATE TABLE table_name
    (
       --statement body
    );
    
  5. 还有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.ymldb 文件夹构建Dockerfile 并使其可通过5431 端口访问。使用基本的 postgres 属性作为环境属性。最后将带有 CSV 文件的 data 文件夹复制到容器中。

【讨论】:

  • 这是一个很棒的答案,应该有更多的支持。解决了我的问题!
  • 您可以简单地将 SQL 文件挂载到您在映像中复制它们的位置。另一种选择是使用 psql-client-Docker-Image。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多