【问题标题】:How to run Sequelize migrations inside Docker如何在 Docker 中运行 Sequelize 迁移
【发布时间】:2021-08-18 06:55:28
【问题描述】:

我正在尝试将我的 NodeJS API 与 MySQL 图像一起进行文档化。在初始运行之前,我想运行 Sequelize 迁移和种子,以使表启动并准备好提供服务。

这是我的docker-compose.yaml

version: '3.8'
services: 
  mysqldb:
    image: mysql
    restart: unless-stopped
    environment:
      MYSQL_ROOT_USER: myuser
      MYSQL_ROOT_PASSWORD: mypassword
      MYSQL_DATABASE: mydb
    ports:
      - '3306:3306'
    networks:
      - app-connect
    volumes: 
      - db-config:/etc/mysql
      - db-data:/var/lib/mysql
      - ./db/backup/files/:/data_backup/data
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    image: node-mysql-app
    depends_on:
      - mysqldb
    ports:
      - '3030:3030'
    networks:
      - app-connect
    stdin_open: true
    tty: true
volumes: 
  db-config:
  db-data:
networks:
  app-connect:
      driver: bridge

这是我应用的Dockerfile

FROM node:lts-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3030
ENV PORT 3030
ENV NODE_ENV docker
RUN npm run db:migrate:up
RUN npm run db:seeds:up
CMD [ "npm", "start" ]

这是我的default.db.json,Sequelize 迁移使用(缩短):

{
  "development": {
    
  },
  "production": {
    
  },
  "docker": {
    "username": "myuser",
    "password": "mypassword",
    "database": "mydb",
    "host": "mysqldb",
    "port": "3306",
    "dialect": "mysql"
  }
}

在运行compose up 时,数据库安装良好,映像部署,但是当它到达RUN npm run db:migrate:up(转换为npx sequelize-cli db:migrate)时出现错误:

npx: installed 81 in 13.108s

Sequelize CLI [Node: 14.17.0, CLI: 6.2.0, ORM: 6.6.2]

Loaded configuration file "default.db.json".
Using environment "docker".


ERROR: getaddrinfo EAI_AGAIN mysqldb
npm ERR! code ELIFECYCLE
npm ERR! errno 1

如果我将default.db.json 中的"host" 更改为"127.0.0.1",我将得到ERROR: connect ECONNREFUSED 127.0.0.1:3306 代替ERROR: getaddrinfo EAI_AGAIN mysqldb

我做错了什么,我应该指定什么主机以便应用程序可以看到 MySQL 容器?我应该删除网络吗?我应该更改端口吗? (到目前为止,我尝试了两者的组合都无济于事)。

【问题讨论】:

标签: mysql node.js docker docker-compose sequelize.js


【解决方案1】:

我使用Docker Compose Wait 解决了我的问题。本质上,它添加了一个对 DB 容器进行采样的等待循环,并且只有在它启动时,才会运行迁移并为 DB 播种。

我的下一个问题是:每次运行容器时都会运行这些种子——我通过运行一个运行种子的脚本和touchs 一个信号量文件来解决这个问题。如果文件已经存在,它会跳过种子。

【讨论】:

  • 您能分享一下您是如何做到的吗?
猜你喜欢
  • 2020-04-27
  • 1970-01-01
  • 2020-09-04
  • 2014-02-21
  • 2017-06-26
  • 2015-09-11
  • 2020-05-01
  • 2020-07-05
  • 1970-01-01
相关资源
最近更新 更多