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

时间:2019-04-02 21:24:54

标签: postgresql docker docker-compose dockerfile

我正在设置一个简单的后端,该后端对postgres数据库执行CRUD操作,并希望在docker-compose up运行时自动创建数据库并进行迁移。

我已经尝试将以下代码添加到 Dockerfile entrypoint.sh 中,但是它们都不起作用。

<div class="splash">
  <picture>
    <img src="//unsplash.it/1600x900" />
  </picture>
  <div class="modal">
    <p>Form goes here/</p>
  </div>
</div>

如果docker完全启动后单独运行,则此代码将起作用

我已经尝试将createdb --host=localhost -p 5432 --username=postgres --no-password pg_development createdb db:migrate 添加到卷中,但这也不起作用

这是 Dockerfile

- ./db-init:/docker-entrypoint-initdb.d

这是我的 docker-compose.yml

FROM node:10.12.0

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

EXPOSE 1337

ENTRYPOINT [ "./entrypoint.sh" ]

entrypoint.sh (在这里我得到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

createdb: command not found

我希望当我运行docker时,将会进行迁移和数据库创建。

3 个答案:

答案 0 :(得分:0)

  

entrypoint.sh(在这里我可以创建b:找不到命令)

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

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

要使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

答案 1 :(得分:0)

我认为您需要先将entrypoint.sh添加到容器中。因此添加:

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

在“公开”命令之前。然后将暴露命令更改为:

ENTRYPOINT [ "/restify-pg/entrypoint.sh" ]

答案 2 :(得分:0)

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