如何解决如何通过 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 和数据库一起运行,但是当我尝试连接到数据库时出现问题。
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 图像文档站点以获取更多信息:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。