【问题标题】:How to create postgres database and run migration when docker-compose updocker-compose时如何创建postgres数据库并运行迁移
【发布时间】:2019-04-02 21:24:53
【问题描述】:

我正在设置一个简单的后端,它使用 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 时,会发生迁移和创建数据库。

【问题讨论】:

    标签: postgresql docker docker-compose dockerfile


    【解决方案1】:

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

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

    如果您在 postgres 容器上指定 POSTGRES_DB: pg_development env var,则数据库将为 created automatically when the container starts。所以无论如何都不需要在安装在 nodejs 容器中的entrypoint.sh 中运行createdb

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

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

    这是一个建议:

    # 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:
        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 db,npx sequelize db:migrate 也错误我找不到 pg_development
    • 当您执行docker-compose up 时,请通读日志以了解发生了什么。如果 postgres 容器在初始化时创建数据库,您应该看到 db_1 | CREATE DATABASE。要尝试的另一件事是将npx sequelize db:create 添加到entrypoint.sh(您可能需要从db 容器中删除POSTGRES_DB: pg_development env var)。
    【解决方案2】:

    如果您可以从 nodejs 而不是 docker 运行迁移,那么请考虑使用 this solution

    【讨论】:

      猜你喜欢
      • 2020-07-05
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      • 2021-05-13
      • 2021-12-29
      相关资源
      最近更新 更多