Redis 连接到 my-redis:6379 失败 - 运行种子时 getaddrinfo ENOTFOUND

CCC*_*CCC 2 mysql redis node.js sequelize.js docker

我正在使用 Docker 来提供容器服务。

\n

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

\n
Sequelize CLI [Node: 13.12.0, CLI: 6.2.0, ORM: 6.5.1]\n\nLoaded configuration file "migrations/config.js".\nUsing environment "development".\nevents.js:292\n      throw er; // Unhandled 'error' event\n      ^\n\nError: Redis connection to my-redis:6379 failed - getaddrinfo ENOTFOUND my-redis\n    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:66:26)\nEmitted 'error' event on RedisClient instance at:\n    at RedisClient.on_error (/Users/CCCC/Desktop/Source Tree/my-server/node_modules/redis/index.js:342:14)\n    at Socket.<anonymous> (/Users/CCCC/Desktop/Source Tree/my-server/node_modules/redis/index.js:223:14)\n    at Socket.emit (events.js:315:20)\n    at Socket.EventEmitter.emit (domain.js:485:12)\n    at emitErrorNT (internal/streams/destroy.js:84:8)\n    at processTicksAndRejections (internal/process/task_queues.js:84:21) {\n  errno: -3008,\n  code: 'ENOTFOUND',\n  syscall: 'getaddrinfo',\n  hostname: 'my-redis'\n}\n
Run Code Online (Sandbox Code Playgroud)\n

似乎显示我的redis未找到/未在端口6379运行。

\n

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

\n
\nCONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                               NAMES\n...\nf637ee218d03        redis:6                          "docker-entrypoint.s\xe2\x80\xa6"   18 minutes ago      Up 18 minutes       0.0.0.0:6379->6379/tcp              my-server_my-redis_1\n
Run Code Online (Sandbox Code Playgroud)\n

docker-compose.yml

\n
version: '2.1'\n\nservices:\n  my-db:\n    image: mysql:5.7\n    ...\n    ports:\n      - 3306:3306\n  my-redis:\n    image: redis:6\n    ports:\n      - 6379:6379\n  my-web:\n    restart: always\n    environment:\n      - NODE_ENV=dev\n      - PORT=3030\n    build: .\n    command: >\n      sh -c "npm install && ./wait-for-db-redis.sh my-db my-redis npm run dev"\n    ports:\n      - "3030:3030"\n    volumes:\n      - ./:/server\n    depends_on:\n      - my-db\n      - my-redis\n\n
Run Code Online (Sandbox Code Playgroud)\n

.sequelizerc

\n
const path = require('path');\n\nmodule.exports = {\n  'config': path.resolve('migrations/config.js'),\n  'seeders-path': path.resolve('migrations/seeders'),\n  'models-path': path.resolve('migrations/models.js')\n};\n\n
Run Code Online (Sandbox Code Playgroud)\n

迁移/model.js

\n
const Sequelize = require('sequelize');\nconst app = require('../src/app');\nconst sequelize = app.get('sequelizeClient');\nconst models = sequelize.models;\n\nmodule.exports = Object.assign({\n  Sequelize,\n  sequelize\n}, models);\n\n
Run Code Online (Sandbox Code Playgroud)\n

配置文件

\n
const app = require('../src/app');\nconst env = process.env.NODE_ENV || 'development';\nconst dialect = 'mysql';\n\nmodule.exports = {\n  [env]: {\n    dialect,\n    url: app.get(dialect),\n    migrationStorageTableName: '_migrations'\n  }\n};\n\n
Run Code Online (Sandbox Code Playgroud)\n

AKX*_*AKX 5

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

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

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