首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无服务器离线- ECONNREFUSED Elasticmq with Docker-Compose

无服务器离线- ECONNREFUSED Elasticmq with Docker-Compose
EN

Stack Overflow用户
提问于 2021-01-07 15:57:07
回答 2查看 983关注 0票数 3

我正在尝试使用无服务器框架来工作,我希望用户可以轻松地在本地运行它,而不必在本地计算机上安装任何必要的驱动程序。我正在使用serverless-offline-sqs和一个托管在Docker容器上的本地Elasticmq服务器。

目前,我已经运行了一个docker-compose文件,然后在另一个运行良好的终端上运行serverless offline。该docker-compose.yml文件如下所示:

代码语言:javascript
复制
# docker-compose.yml

version: '3'
services:
  database:
    image: 'mongo'
    container_name: 'database'
    environment:
      - MONGO_INITDB_DATABASE=scraper_database
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin
    volumes:
    - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
    - ./mongo-volume:/data/db
    ports:
      - '27017-27019:27017-27019'
    command: mongod --quiet --logpath /dev/null
  sqs:
    image: softwaremill/elasticmq:latest
    container_name: 'sqs'
    ports:
      - '9324:9324'
  sqs-create:
    image: infrastructureascode/aws-cli:latest
    container_name: 'sqs-create'
    links:
      - sqs
    entrypoint: sh
    command: ./create-queues.sh
    volumes:
      - ./scripts/create-queues.sh:/project/create-queues.sh:ro
    environment:
      - AWS_ACCESS_KEY_ID=local
      - AWS_SECRET_ACCESS_KEY=local
      - AWS_DEFAULT_REGION=eu-east-1
      - AWS_ENDPOINT_URL=http://sqs:9324

这工作得很好,没有问题,在确保我的所有容器都已启动后,我可以运行serverless offline,我的应用程序也可以工作了。我还试图在自己的docker容器中包含运行Serverless的行为。我已经创建了以下Dockerfile:

代码语言:javascript
复制
# Dockerfile

FROM node:12

RUN npm --loglevel=error install -g serverless && npm --loglevel=error install -g serverless-offline

WORKDIR /usr/src/app

COPY package*.json ./

COPY ./scripts/wait-for-it.sh ./

RUN ["chmod", "+x", "/usr/src/app/wait-for-it.sh"]

RUN npm install

COPY . .

EXPOSE 3000

我正在尝试遵循Docker文档来影响启动顺序,找到here以确保在运行此命令之前我的队列服务已启动。这将我带到了docker-compose.yml:

代码语言:javascript
复制
version: '3'
services:
  serverless:
    container_name: 'serverless'
    build:
      context: .
      dockerfile: Dockerfile
    env_file:
      - .env.development
    ports:
      - '3000:3000'
    depends_on:
      - sqs
    command: ["./wait-for-it.sh", "sqs:9324", "--", "serverless", "offline"]
  database:
    image: 'mongo'
    container_name: 'database'
    environment:
      - MONGO_INITDB_DATABASE=scraper_database
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin
    volumes:
    - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
    - ./mongo-volume:/data/db
    ports:
      - '27017-27019:27017-27019'
    command: mongod --quiet --logpath /dev/null
  sqs:
    image: softwaremill/elasticmq:latest
    container_name: 'sqs'
    ports:
      - '9324:9324'
  sqs-create:
    image: infrastructureascode/aws-cli:latest
    container_name: 'sqs-create'
    links:
      - sqs
    entrypoint: sh
    command: ./create-queues.sh
    volumes:
      - ./scripts/create-queues.sh:/project/create-queues.sh:ro
    environment:
      - AWS_ACCESS_KEY_ID=local
      - AWS_SECRET_ACCESS_KEY=local
      - AWS_DEFAULT_REGION=eu-east-1
      - AWS_ENDPOINT_URL=http://sqs:9324

我正在使用Docker文档建议的wait-for-it.sh脚本,但它显示我收到以下错误:

代码语言:javascript
复制
Successfully built 38df0769a202
Successfully tagged assessorscraper_serverless:latest
Starting sqs      ... done
Starting database     ... done
Recreating serverless ... done
Starting sqs-create   ... done
Attaching to sqs, database, sqs-create, serverless
serverless    | wait-for-it.sh: waiting 15 seconds for sqs:9324
sqs           | 07:54:45.046 [main] INFO  org.elasticmq.server.Main$ - Starting ElasticMQ server (1.0.0) ...
sqs           | 07:54:48.133 [elasticmq-akka.actor.default-dispatcher-6] INFO  akka.event.slf4j.Slf4jLogger - Slf4jLogger started
sqs           | 07:54:51.385 [elasticmq-akka.actor.default-dispatcher-7] INFO  o.e.rest.sqs.TheSQSRestServerBuilder - Started SQS rest server, bind address 0.0.0.0:9324, visible server address http://localhost:9324
sqs           | 07:54:51.643 [elasticmq-akka.actor.default-dispatcher-7] INFO  o.e.r.s.TheStatisticsRestServerBuilder - Started statistics rest server, bind address 0.0.0.0:9325
sqs           | 07:54:51.649 [main] INFO  org.elasticmq.server.Main$ - === ElasticMQ server (1.0.0) started in 8819 ms ===
serverless    | wait-for-it.sh: sqs:9324 is available after 9 seconds
sqs-create    | Creating queue TownQueue
sqs           | 07:54:53.808 [elasticmq-akka.actor.default-dispatcher-6] INFO  o.elasticmq.actor.QueueManagerActor - Creating queue QueueData(TownQueue,MillisVisibilityTimeout(30000),PT0S,PT0S,2021-01-07T07:54:53.494Z,2021-01-07T07:54:53.494Z,None,false,false,None,None,Map())
sqs-create exited with code 0
serverless    | Serverless: Running "serverless" installed locally (in service node_modules)
serverless    | Serverless: DOTENV: Loading environment variables from .env.development:
serverless    | Serverless:      - DATABASE_URL
serverless    | Serverless:      - ACCOUNT_ID
serverless    | Serverless:      - QUEUE_URL
serverless    | Serverless: Deprecation warning: Starting with next major version, default value of provider.lambdaHashingVersion will be equal to "20201221"
serverless    |             More Info: https://www.serverless.com/framework/docs/deprecations/#LAMBDA_HASHING_VERSION_V2
serverless    | Serverless: Deprecation warning: Starting with next major version, API Gateway naming will be changed from "{stage}-{service}" to "{service}-{stage}".
serverless    |             Set "provider.apiGateway.shouldStartNameWithService" to "true" to adapt to the new behavior now.
serverless    |             More Info: https://www.serverless.com/framework/docs/deprecations/#AWS_API_GATEWAY_NAME_STARTING_WITH_SERVICE
serverless    | offline: Error: connect ECONNREFUSED 0.0.0.0:9324
serverless    |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1144:16)
serverless    |  
serverless    |   Networking Error ---------------------------------------
serverless    |  
serverless    |   Error: connect ECONNREFUSED 0.0.0.0:9324
serverless    |       at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1144:16)
serverless    |  
serverless    |      For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.
serverless    |  
serverless    |   Get Support --------------------------------------------
serverless    |      Docs:          docs.serverless.com
serverless    |      Bugs:          github.com/serverless/serverless/issues
serverless    |      Issues:        forum.serverless.com
serverless    |  
serverless    |   Your Environment Information ---------------------------
serverless    |      Operating System:          linux
serverless    |      Node Version:              12.20.1
serverless    |      Framework Version:         2.17.0 (local)
serverless    |      Plugin Version:            4.4.1
serverless    |      SDK Version:               2.3.2
serverless    |      Components Version:        3.4.4
serverless    |  

我还会有一些竞争状况吗?如果有任何建议,我们将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-21 14:16:46

问题很可能出在ECONNREFUSED 0.0.0.0:9324上。从端口号判断,这是试图访问sqs服务的行为,但IP地址是错误的。它应该连接到sqs:9324或容器IP地址。0.0.0.0的意思是“任何IP地址”,通常用于绑定端口。检查您的serverless配置。

此外,你可以很容易地检查你是否处于“竞速状态”。为此,只需使用多个终端逐个启动您的服务:

代码语言:javascript
复制
docker-compose up database
docker-compose up sqs
docker-compose up sqs-create
docker-compose up serverless

如果您可以一个接一个地启动服务,那么很可能就是这样。在这种情况下,您可以向服务添加restart: on-failure属性。这样,如果容器退出时返回的代码不是0- docker就会重新启动容器。

票数 2
EN

Stack Overflow用户

发布于 2021-01-28 13:32:20

事实证明,我的问题实际上出在我的serverless.yml配置中。在这里,我的serverless.yml具有如下的custom配置:

代码语言:javascript
复制
custom:
  serverless-offline-sqs:
    autoCreate: true                 # create queue if not exists
    apiVersion: '2012-11-05'
    endpoint: http://0.0.0.0:9324
    region: us-east-1
    accessKeyId: root
    secretAccessKey: root
    skipCacheInvalidation: false

正确的端点实际上是`http://sqs:9324'。其他的都是正确的!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65608537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档