使用Docker Compose Psql进行Knex迁移

时间:2018-12-03 12:34:05

标签: postgresql docker docker-compose knex.js

我在docker-compose容器中使用Knex js迁移时遇到问题。  问题是npm run db(knex migration:rollback && knex migration:latest && knex seed:run)会在数据库创建之前立即运行。无论如何,创建数据库后我只想运行npm run db吗?

注意:如果我在docker终端上执行此npm命令,则在构建后一切正常。只是

这是我的docker-compose.yml

version: '3.6'

services:
  #Backend api
  server:
    container_name: server
    build: ./
    command: npm run db
    working_dir: /user/src/server
    ports:
      - "5000:5000"
    volumes:
      - ./:/user/src/server
    environment:
      POSTGRES_URI: postgres://test:test@192.168.99.100:5432/interapp
    links:
      - postgres

  # PostgreSQL database
  postgres:
    environment:
      POSTGRES_USER: test
      POSTGRES_PASSWORD: test
      POSTGRES_DB: interapp
      POSTGRES_HOST: postgres
    image: postgres
    ports:
      - "5432:5432"

这是我的Dockerfile

FROM node:10.14.0

WORKDIR /user/src/server

COPY ./ ./

RUN npm install

CMD ["/bin/bash"]

2 个答案:

答案 0 :(得分:0)

只需在服务器服务中添加depends_on即可解决问题。

services:
    server:
        depends_on:
            - postgres
        ...

这将导致docker-compose在服务器容器之前启动postgres容器。但是它不会等待postgres准备好。在这种情况下,应该没问题,因为postgres的启动速度非常快。

如果您想要更坚固的东西,或者depends_on不能解决问题,则可以将入口点包装脚本添加到容器中。请参阅https://docs.docker.com/compose/startup-order/,在这里您可以了解更多信息。也有指向工具的链接,因此您不必从头开始编写自己的脚本。

答案 1 :(得分:0)

在docker-compose.yml文件中,使用sh(bash)包含要在其中运行命令的环境上下文。 sh -c'npm运行数据库' 您的docker-compose文件现在将是 其次,使用depends_on步骤等待数据库启动

services:
  #Backend api
    server:
    container_name: server
    build: ./
    command: sh -c 'npm run db'
    working_dir: /user/src/server
  depends_on:
    -postgres
  ports:
    - "5000:5000"
  volumes:
    - ./:/user/src/server
  environment:
    POSTGRES_URI: postgres://test:test@192.168.99.100:5432/interapp
  links:
    - postgres