Как создать базу данных postgres и запустить миграцию при создании docker - PullRequest
2 голосов
/ 03 апреля 2019

Я устанавливаю простой бэкэнд, который выполняет действие CRUD с базой данных postgres и хочет автоматически создавать базу данных и миграцию при запуске docker-compose up.

Я уже пытался добавить приведенный ниже код в Dockerfile или entrypoint.sh , но ни один из них не работает.

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

Этот код будет работать, если запускаться отдельно после полного запуска докера

Я уже пытался добавить - ./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 ]

0 голосов
/ 03 апреля 2019

Я думаю, вам нужно сначала добавить entrypoint.sh в контейнер.так что добавьте это:

ADD entrypoint.sh /restify-pg/entrypoint.sh

перед командой Expose.и затем измените команду выставления на:

ENTRYPOINT [ "/restify-pg/entrypoint.sh" ]
0 голосов
/ 03 апреля 2019

entrypoint.sh (здесь я получаю createb: команда не найдена)

Выполнение createdb в контейнере nodejs не будет работать, потому что это команда, специфичная для postgres, и она не установленапо умолчанию в образе nodejs.

Если вы укажете POSTGRES_DB: pg_development env var в контейнере postgres, база данных будет автоматически создана при запуске контейнера .Так что нет необходимости запускать createdb в любом случае в entrypoint.sh, который смонтирован в контейнере nodejs.

Чтобы заставить sequelize db:migrate работать, вам необходимо:

  • add 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...