【问题标题】:How to set up my nodejs backend via docker so that the database is built with the proper tables?如何通过 docker 设置我的 nodejs 后端,以便使用正确的表构建数据库?
【发布时间】:2021-08-10 05:56:41
【问题描述】:

这可能有点混乱,所以我将相应地讨论我的整个设置并描述我的目标。

我正在使用 Node.js/Express 开发一个 API。我已经集成了 docker,因此当任何人尝试运行应用程序时,他们只需要运行命令 docker compose up

命令的设置方式是通过dockerfile + docker-compose.yml

docker-compose.yml 包含以下内容

version: '3.4'

services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_USER: postgres
      POSTGRES_DB: mainDB
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    ports:
      - '5432:5432'
  api:
    image: api
    depends_on: 
      - db
    build:
      context: .
      dockerfile: ./Dockerfile
    environment:
      NODE_ENV: production
    ports:
      - 3000:3000
    volumes:
      - .:/usr/src/app

这会将 docker 容器设置为同时运行 api 和数据库,但是当我尝试连接到数据库时会出现问题。

我有一个包含以下内容的 sql 文件

DROP TABLE IF EXISTS fruits;

CREATE TABLE fruits (
    fruitID INTEGER primary key,
    fruitName VARCHAR(255) NOT NULL,
    fruitColor VARCHAR(255),
);

我目前无法通过 pgAdmin 连接到数据库,我得到的错误是我引用的数据库名称不存在(“mainDB”)。当我通过终端进入 psql 时,它也没有显示数据库的存在。

我的总体困惑是:我该如何设置,以便在执行命令 docker compose up 时,用户能够同时运行 api 和数据库,同时在数据库中创建表?

这可行吗?从我在教程中看到的是,人们拥有这些 sql 文件,只需将命令复制并粘贴到 psql 命令行中。如果我必须从我的 psql 命令行手动构建数据库,那么在 docker-compose.yml 文件中运行数据库有什么意义?

【问题讨论】:

    标签: node.js postgresql docker docker-compose


    【解决方案1】:

    如果您只对在创建容器时为应用程序设置数据库感兴趣,可以使用 PostgreSQL 的Initialization Scripts

    您可以在/docker-entrypoint-initdb.d 文件夹上挂载任意数量的脚本,PostgreSQL 在空目录上启动时将运行这些脚本。

    根据您当前的设置和 PostgreSQL 映像文档中推荐的最佳实践,您可以执行以下操作:

    首先,编写一个脚本来生成用户、数据库及其所有表。当其中一个 init 脚本出现故障并重新启动容器时,像这样包装它可以避免普遍错误。

    #!/bin/bash
    set -e
    
    psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
        CREATE USER docker;
        CREATE DATABASE docker;
        GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
    
        CREATE TABLE fruits (
            fruitID INTEGER primary key,
            fruitName VARCHAR(255) NOT NULL,
            fruitColor VARCHAR(255),
        );
    EOSQL
    

    然后通过更新您的docker-compose.yml 文件将该脚本挂载到适当的文件夹:

    version: '3.4'
    
    services:
      db:
        image: postgres
        environment:
          POSTGRES_PASSWORD: password
          POSTGRES_USER: postgres
          POSTGRES_DB: mainDB
        volumes:
          - ./pgdata:/var/lib/postgresql/data
          # Suppose the SQL file you provided was on the same folder as 
          # the docker-compose file.
          - ./fruits.sh:/docker-entrypoint-initdb.d/001-fruits.sh
        ports:
          - '5432:5432'
      api:
        image: api
        depends_on: 
          - db
        build:
          context: .
          dockerfile: ./Dockerfile
        environment:
          NODE_ENV: production
        ports:
          - 3000:3000
        volumes:
          - .:/usr/src/app
    

    PostgreSQL 将运行按字母顺序提供的初始化脚本。因此,如果您需要它们按特定顺序运行,您应该在它们前面加上一个订单号。

    您应该会看到该架构现在在数据库中可用。

    查看 PostgreSQL 图像文档站点了解更多信息:

    https://hub.docker.com/_/postgres

    【讨论】:

    • 感谢您的回答。我使用了您所说的内容,但通过使用 sql 文件而不是 sh 文件对其进行了微调。您的回答肯定使事情变得清晰+我从这篇中等文章中获得的信息。 onexlab-io.medium.com/…
    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多