如何 运行 在 Docker 中对迁移进行后续处理
How to run Sequelize migrations inside Docker
我正在尝试将我的 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 容器?我应该删除网络吗?我应该更改端口吗? (到目前为止,我尝试了两者的组合但无济于事)。
我使用 Docker Compose Wait 解决了我的问题。本质上,它添加了一个对数据库容器进行采样的等待循环,只有当它启动时,运行才会迁移并为数据库播种。
我的下一个问题是:那些种子 运行 每次容器都是 运行 - 我解决了这个问题 运行 宁一个脚本 运行 种子, touch
s 是一个信号文件。如果文件已经存在,它会跳过种子。
我发现了一个非常干净的解决方案想要分享。首先我使用了 docker-compose,所以如果你只使用 docker,它可能没有帮助。
首先,我创建了一个 docker 文件,它看起来像 that.I 我正在使用 typescript,所以如果你使用的是 js,你不需要下载 typescript 并构建它!
FROM node:current-alpine
WORKDIR /app
COPY . ./
COPY .env.development ./.env
RUN npm install
RUN npm install -g typescript
RUN npm install -g sequelize-cli
RUN npm install -g nodemon
RUN npm run build
RUN rm -f .npmrc
RUN cp -R res/ dist/
RUN chmod 755 docker/entrypoint.sh
EXPOSE 8000
EXPOSE 3000
EXPOSE 9229
CMD ["sh", "-c","--","echo 'started';while true; do sleep 1000; done"]
到这里它是标准的。为了按正确的顺序做事,我需要一个 docker 组合和入口点文件。入口点文件是一个文件,在容器启动时运行。这是 docker-compose 文件。
version: '3'
services:
app:
build:
context: ..
dockerfile: docker/Dockerfile.development
entrypoint: docker/development-entrypoint.sh
ports:
- 3000:3000
env_file:
- ../.env.development
depends_on:
- postgres
postgres:
image: postgres:alpine
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=test
volumes:
- ./docker_postgres_init.sql:/docker-entrypoint-initdb.d/docker_postgres_init.sql
如您所见,我正在为数据库使用 postgresql。我的 docker 文件、docker-compose 和入口点文件都在一个名为 docker 的文件夹中,这就是路径以 docker 开头的原因,请根据您的文件结构更改它。最后也是最好的部分是入口点文件。真的很简单。
#!/bin/sh
echo "Starting get ready!!!"
sequelize db:migrate
nodemon ./dist/index.js
当然可以根据您的设置更改 index.js 文件的路径。
希望对您有所帮助!
我正在尝试将我的 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 容器?我应该删除网络吗?我应该更改端口吗? (到目前为止,我尝试了两者的组合但无济于事)。
我使用 Docker Compose Wait 解决了我的问题。本质上,它添加了一个对数据库容器进行采样的等待循环,只有当它启动时,运行才会迁移并为数据库播种。
我的下一个问题是:那些种子 运行 每次容器都是 运行 - 我解决了这个问题 运行 宁一个脚本 运行 种子, touch
s 是一个信号文件。如果文件已经存在,它会跳过种子。
我发现了一个非常干净的解决方案想要分享。首先我使用了 docker-compose,所以如果你只使用 docker,它可能没有帮助。 首先,我创建了一个 docker 文件,它看起来像 that.I 我正在使用 typescript,所以如果你使用的是 js,你不需要下载 typescript 并构建它!
FROM node:current-alpine
WORKDIR /app
COPY . ./
COPY .env.development ./.env
RUN npm install
RUN npm install -g typescript
RUN npm install -g sequelize-cli
RUN npm install -g nodemon
RUN npm run build
RUN rm -f .npmrc
RUN cp -R res/ dist/
RUN chmod 755 docker/entrypoint.sh
EXPOSE 8000
EXPOSE 3000
EXPOSE 9229
CMD ["sh", "-c","--","echo 'started';while true; do sleep 1000; done"]
到这里它是标准的。为了按正确的顺序做事,我需要一个 docker 组合和入口点文件。入口点文件是一个文件,在容器启动时运行。这是 docker-compose 文件。
version: '3'
services:
app:
build:
context: ..
dockerfile: docker/Dockerfile.development
entrypoint: docker/development-entrypoint.sh
ports:
- 3000:3000
env_file:
- ../.env.development
depends_on:
- postgres
postgres:
image: postgres:alpine
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=test
volumes:
- ./docker_postgres_init.sql:/docker-entrypoint-initdb.d/docker_postgres_init.sql
如您所见,我正在为数据库使用 postgresql。我的 docker 文件、docker-compose 和入口点文件都在一个名为 docker 的文件夹中,这就是路径以 docker 开头的原因,请根据您的文件结构更改它。最后也是最好的部分是入口点文件。真的很简单。
#!/bin/sh
echo "Starting get ready!!!"
sequelize db:migrate
nodemon ./dist/index.js
当然可以根据您的设置更改 index.js 文件的路径。 希望对您有所帮助!