当我使用以下命令构建项目的容器时:
sudo docker build -t PROJECT_NAME .
然后我通过此Docker-Compose配置下载mysql的映像:
db:
image: mysql
restart: always
ports:
- "8999:3306"
networks:
- webnet
environment:
MYSQL_DATABASE: slack
MYSQL_ROOT_PASSWORD: admin
然后,该项目将通过Sequelize ORM
与MySQL连接我遇到此错误:
Unhandled rejection SequelizeConnectionRefusedError: connect ECONNREFUSED 172.18.0.4:3306
我该如何解决?
Sequelize配置是这样的:
const sequelize = new Sequelize(process.env.TEST_DB || 'slack', 'root', 'admin', {
host: process.env.DB_HOST || 'localhost',
operatorsAliases: Sequelize.Op,
dialect: 'mysql',
define: {
underscored: true
}
});
网络的配置是这样的:
web:
image: slack-clone-server
ports:
- "8080:8080"
networks:
- webnet
environment:
DB_HOST: db
REDIS_HOST: redis
command: ["./wait-for-it.sh", "db:3306", "--", "npm", "run", "prod"]
名为“等待它”的脚本是this。
如果某人需要完整的代码,请按以下步骤操作:
答案 0 :(得分:1)
wait-for-it.sh
等待15 seconds并返回,即使目标尚未准备好也是如此。您也可以在输出中看到这一点。但是数据库尚未准备好。使wait-for-it.sh
wait longer,也许让-t 90
等待90秒,或者使-t 0
使其永远等待。
(以我的经验,Docker数据库容器通常需要30-60秒才能启动,尤其是第一次启动。)
答案 1 :(得分:1)
David已经说过数据库目前还没有准备好。您也可以在docker-compose文件中使用 depends_on 。这将首先启动并初始化数据库,然后启动“ Web”容器。
services:
web:
...
depends_on:
- db
db:
image: mariadb:latest
...
答案 2 :(得分:0)
db:
container_name: mysqldb //or whatever you want <<Add This
image: mysql
restart: always
ports:
- "8999:3306"
networks:
- webnet
environment:
MYSQL_DATABASE: slack
MYSQL_ROOT_PASSWORD: admin
然后将process.env.DB_HOST
的值分配给 Mysql容器名称
像:process.env.DB_HOST=mysqldb
答案 3 :(得分:0)
将process.env.DB_HOST的值分配给Mysql容器名称
例如:process.env.DB_HOST = mysqldb