如何在节点 pg 中设置 postgres 数据库和表

Mik*_*kel 5 postgresql node.js node-postgres docker

我想分享一个Noderepo,理想情况下它应该在通常的yarn install && yarn start.

但是,pg既不能连接SELECT到/从尚不存在的数据库和表。

这很麻烦,但目前需要这些前面的步骤:

  1. 获取 postgres; docker run --name my-postgres -e POSTGRES_PASSWORD={MY_PASSWORD} -p 5432:5432 -d --rm postgres:13.0
  2. 启动 psql; docker exec -it -u postgres my-postgres psql
  3. CREATE DATABASE MY_DB
  4. \connect MY_DB
  5. 粘贴以下 SQL 脚本以创建表
CREATE TABLE my_table (
  id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  field_1 VARCHAR ( 50 ) UNIQUE NOT NULL,
  field_2 INT NOT NULL,
);
Run Code Online (Sandbox Code Playgroud)

因为我已经从泊坞窗获得的Postgres,是docker-componse合理的解决方案?我不太熟悉dockerfile,有没有其他选择?

在节点中初始化 postgres 数据库的最佳实践是什么?

yarn start(或yarn setup)上调用脚本是多么糟糕的主意。任何此类脚本的示例将不胜感激。

Pau*_*kin 4

脚本

那么放置配置的正确位置是在启动脚本中。该脚本应该运行两个命令来设置服务器(如果没有)并运行它。例子:

// package.json
{
  "scripts": {
    "start": "yarn run setup && yarn run server",
    "server": "node app.js",
    "setup": "node setup.js"
  }
}
Run Code Online (Sandbox Code Playgroud)

码头工人

如果你想运行像 db 这样的外部有状态服务,那么你需要将其状态存储在某个地方。--rm选项删除机器及其状​​态。因此,为了防止它删除使用-v参数并将 PG 数据库从来宾机器放到主机上。对于 postgres 来说,它可能看起来像这样:

docker run --rm -v "$PWD/data/pg:/var/lib/postgresql/data/" -p 5432 postgres 
Run Code Online (Sandbox Code Playgroud)

但正如您所说,最好使用 docker-compose。

Docker 组合

Docker compose 可让您将多个容器作为一个容器运行。它使用 compose-files 作为单点配置。使用 compose-files,您可以配置应用程序所需的所有软件(数据库、redis、文件存储等)并链接应用程序数据。它还允许您在容器中运行应用程序。这是使用 Postgres DB 的应用程序的配置方式:

version: "3.8"
services:
  postgre:
    image: postgre
    ## Store persistent postgres data
    volumes:
      - ./data/pg:/var/lib/postgresql/data/
    environment:
      POSTGRES_USERNAME: admin
      POSTGRES_PASSWORD: '********'
  app:
    image: node
    ports:
      - "8080:8080"
    ## Mount current project to guest as /app
    volumes:
      - .:/app
    ## Set PWD to /app
    working_dir: /app
    command: yarn start
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用命令运行您的应用程序docker-compose start并使用命令停止它docker-compose stop

要从节点的应用程序容器连接到 postgres,请使用postgre(或您在撰写文件中指定的名称)作为主机名。

提示

如果您的本地 Node.js 版本与容器版本不同,则可能需要从node_modules/容器安装文件并将其放入主机系统。为此,请运行:

docker run --rm -v "$PWD:/app" -w /app node yarn install
Run Code Online (Sandbox Code Playgroud)

它将在主机中安装正确版本的节点模块。