如何在 Docker 中运行 Sequelize 迁移
Posted
技术标签:
【中文标题】如何在 Docker 中运行 Sequelize 迁移【英文标题】:How to run Sequelize migrations inside Docker 【发布时间】: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 容器?我应该删除网络吗?我应该更改端口吗? (到目前为止,我尝试了两者的组合都无济于事)。
【问题讨论】:
我希望能帮上忙。我在这里找到了类似的东西。 ***.com/questions/60916919/… 【参考方案1】:我使用Docker Compose Wait 解决了我的问题。本质上,它添加了一个对 DB 容器进行采样的等待循环,并且只有在它启动时,才会运行迁移并为 DB 播种。
我的下一个问题是:每次运行容器时都会运行这些种子——我通过运行一个运行种子的脚本和touch
s 一个信号量文件来解决这个问题。如果文件已经存在,它会跳过种子。
【讨论】:
您能分享一下您是如何做到的吗?以上是关于如何在 Docker 中运行 Sequelize 迁移的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MySql 中使用 sequelize 运行多个原始查询?
NodeJS sequelize 自动生成模型并运行迁移 SQL 语法错误
如何在 Node.js 中使用 Sequelize 运行 AND 和 Or 运算符
Sequelize 无法从 Node/express 应用程序同步到 docker 容器中的 MySQL (ECONNREFUSED)