微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过 docker 设置我的 nodejs 后端,以便使用正确的表构建数据库?

如何解决如何通过 docker 设置我的 nodejs 后端,以便使用正确的表构建数据库?

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

我正在使用 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 文件中运行数据库有什么意义?

解决方法

如果您只对在创建容器时为应用程序设置数据库感兴趣,您可以使用 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 将按字母顺序运行提供的 init 脚本。因此,如果您需要它们按特定顺序运行,您应该在它们前面加上一个订单号。

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

查看 PostgreSQL 图像文档站点以获取更多信息:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?