【问题标题】:Redis connection to my-redis:6379 failed - getaddrinfo ENOTFOUND when running seedsRedis 连接到 my-redis:6379 失败 - 运行种子时 getaddrinfo ENOTFOUND
【发布时间】:2021-08-25 07:01:54
【问题描述】:

我正在使用 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…"   18 minutes ago      Up 18 minutes       0.0.0.0:6379->6379/tcp              my-server_my-redis_1

docker-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);

config.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'
  }
};

【问题讨论】:

    标签: mysql node.js docker redis sequelize.js


    【解决方案1】:

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

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

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

    【讨论】:

    • 我在我的项目文件夹中运行它。我该如何解决?
    • 您需要在应用程序容器中运行该命令。见docs.docker.com/compose/reference/exec
    • 我运行docker-compose exec my-web sh,然后运行npx sequelize-cli db:seed:all。它有效!
    • 由于主机开发环境和 docker 部署环境有不同的主机名可用,您需要确保 Redis 位置等内容是可配置的,或许可以使用环境变量。
    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 2017-07-06
    • 2023-03-18
    • 1970-01-01
    • 2021-06-25
    • 2017-05-16
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多