首页 > 解决方案 > Redis 连接到 my-redis:6379 失败 - 运行种子时 getaddrinfo ENOTFOUND

问题描述

我将 Docker 用于容器服务。

我创建了一个种子文件并运行它npx sequelize-cli db:seed:all,然后出现错误:

Sequelize CLI [Node: 13.12.0, CLI: 6.2.0, ORM: 6.5.1]

Loaded configuration file "migrations/config.js".
Using environment "development".
events.js:292
      throw er; // Unhandled 'error' event
      ^

Error: Redis connection to my-redis:6379 failed - getaddrinfo ENOTFOUND my-redis
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:66:26)
Emitted 'error' event on RedisClient instance at:
    at RedisClient.on_error (/Users/CCCC/Desktop/Source Tree/my-server/node_modules/redis/index.js:342:14)
    at Socket.<anonymous> (/Users/CCCC/Desktop/Source Tree/my-server/node_modules/redis/index.js:223:14)
    at Socket.emit (events.js:315:20)
    at Socket.EventEmitter.emit (domain.js:485:12)
    at emitErrorNT (internal/streams/destroy.js:84:8)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  errno: -3008,
  code: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'my-redis'
}

似乎表明我的 redis 在端口 6379 中未找到/未运行。

然后我运行docker ps,它显示my-redis在端口 6379 中运行。


CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                               NAMES
...
f637ee218d03        redis:6                          "docker-entrypoint.s…&quot;   18 minutes ago      Up 18 minutes       0.0.0.0:6379->6379/tcp              my-server_my-redis_1

码头工人-compose.yml

version: '2.1'

services:
  my-db:
    image: mysql:5.7
    ...
    ports:
      - 3306:3306
  my-redis:
    image: redis:6
    ports:
      - 6379:6379
  my-web:
    restart: always
    environment:
      - NODE_ENV=dev
      - PORT=3030
    build: .
    command: >
      sh -c "npm install && ./wait-for-db-redis.sh my-db my-redis npm run dev"
    ports:
      - "3030:3030"
    volumes:
      - ./:/server
    depends_on:
      - my-db
      - my-redis

.sequelizerc

const path = require('path');

module.exports = {
  'config': path.resolve('migrations/config.js'),
  'seeders-path': path.resolve('migrations/seeders'),
  'models-path': path.resolve('migrations/models.js')
};

迁移/model.js

const Sequelize = require('sequelize');
const app = require('../src/app');
const sequelize = app.get('sequelizeClient');
const models = sequelize.models;

module.exports = Object.assign({
  Sequelize,
  sequelize
}, models);

配置.js

const app = require('../src/app');
const env = process.env.NODE_ENV || 'development';
const dialect = 'mysql';

module.exports = {
  [env]: {
    dialect,
    url: app.get(dialect),
    migrationStorageTableName: '_migrations'
  }
};

标签: mysqlnode.jsdockerredissequelize.js

解决方案


您是在 Docker Compose 容器中为您的应用程序运行迁移,还是在 Docker 主机上运行迁移?

从主机的角度来看,没有这样的主机名my-redis (它只是一个包含该容器的 Docker 覆盖网络中的东西)。

由于您已将 Redis 端口 6379 暴露给您的主机(实际上是整个世界),您将localhost:6379在主机上使用。


推荐阅读