如何在docker-compose up时创建postgres数据库并运行迁移

22

我正在搭建一个简单的后端,使用Postgres数据库执行CRUD操作,并希望在运行docker-compose up时自动创建数据库和迁移。

我已经尝试将以下代码添加到Dockerfileentrypoint.sh中,但它们都没有起作用。

createdb --host=localhost -p 5432 --username=postgres --no-password pg_development
createdb db:migrate
此代码仅在完全启动Docker后单独运行时有效。 我已尝试将- ./db-init:/docker-entrypoint-initdb.d添加到卷中,但也不起作用。 这是Dockerfile
FROM node:10.12.0

# Create app directory
RUN mkdir -p /restify-pg
WORKDIR /restify-pg

EXPOSE 1337

ENTRYPOINT [ "./entrypoint.sh" ]

这是我的docker-compose.yml

version: '3'
services:
  db:
    image: "postgres:11.2"
    ports:
      - "5432:5432"
    volumes:
      - ./pgData:/var/lib/psotgresql/data
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD:
      POSTGRES_DB: pg_development

  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - .:/restify-pg
    environment:
      DB_HOST: db

entrypoint.sh(在这里我得到了createdb: command not found


#!/bin/bash

cd app

createdb --host=localhost -p 5432 --username=postgres --no-password pg_development
sequelize db:migrate

npm install
npm run dev

我期望在运行 Docker 时,迁移和数据库创建会自动发生。

2个回答

9

entrypoint.sh(在这里我收到了“createdb: command not found”)

在nodejs容器中运行createdb是不起作用的,因为它是postgres特定的命令,并且在nodejs镜像中默认未安装。

如果在postgres容器上指定POSTGRES_DB:pg_development环境变量,则在容器启动时将自动创建数据库。所以,在挂载在nodejs容器中的entrypoint.sh中无需运行createdb

为使sequelize db:migrate工作,您需要:

  • package.json中的依赖项中添加sequelize-cli
  • 运行npm install进行安装
  • 运行npx sequelize db:migrate

以下是一个建议:

# docker-compose.yml

version: '3'
services:
  db:
    image: "postgres:11.2"
    ports:
      - "5432:5432"
    volumes:
      - ./pgData:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD:
      POSTGRES_DB: pg_development

  app:
    working_dir: /restify-pg
    entrypoint: ["/bin/bash", "./entrypoint.sh"]
    image: node:10.12.0
    ports:
      - "3000:3000"
    volumes:
      - .:/restify-pg
    environment:
      DB_HOST: db


# package.json

{
  ...
  "dependencies": {
    ...
    "pg": "^7.9.0",
    "pg-hstore": "^2.3.2",
    "sequelize": "^5.2.9",
    "sequelize-cli": "^5.4.0"
  }
}

# entrypoint.sh

npm install
npx sequelize db:migrate
npm run dev

npx sequelize db:migrate 工作得非常好,但我仍然无法创建 pg_development 数据库。同时 npx sequelize db:migrate 报错说找不到 pg_development 数据库。 - Ashkan
当您执行 docker-compose up 时,请仔细阅读日志以了解正在发生的情况。如果 postgres 容器在初始化时创建数据库,则应看到 db_1 | CREATE DATABASE。另一个尝试的方法是将 npx sequelize db:create 添加到 entrypoint.sh 中(您可能需要从 db 容器中删除 POSTGRES_DB: pg_development 环境变量)。 - Artem Titkov

0

如果您可以从Node.js而不是Docker运行迁移,则请考虑使用此解决方案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接