当前位置: 首页 > 面试题库 >

等待node.js直到使用容器准备好Logstash

龚彬
2023-03-14
问题内容

我在中进行以下设置docker-compose.yml

....

logstash:
  container_name: logstash
  image: docker.elastic.co/logstash/logstash:6.2.4

node:
  container_name: node
  build:
    context: ./node/
    dockerfile: ./Dockerfile
  depends_on:
    - logstash

....

我正在使用包装winston-logstash将它们连接在一起。

这是传输层:

const logstashHost = process.env.LOGSTASH_HOST || 'logstash'
const logstashPort = process.env.LOGSTASH_PORT || 5045

new (winstonLogstash.Logstash)({
  host: logstashHost,
  port: logstashPort,
  node_name: 'node',
  timestamp: true,
  max_connect_retries: 5,
  timeout_connect_retries: 1000,
})

以及管道配置:

input {
  tcp {
    port => 5045
  }
}
output {
  stdout{}
  elasticsearch {
    hosts => ["elasticsearch:9200"]
  }
}

在中使用docker-compose up结果Error: Max retries reached, transport in silent mode, OFFLINE

如果我使用较大setTimeout的连接尝试次数或增加连接重试次数来手动启动服务器,则该服务器最终将正常工作。如果我启动logstash并且过一会儿启动节点容器,它也可以工作。

问题在于,显然这不是一个好习惯,我无法猜测logstash启动将花费多长时间,并且其中的depends_on指令docker- compose.yml根本没有帮助。

我需要一种方法来知道什么时候logstash准备好,然后再启动node容器。


问题答案:

Docker compose不会等到容器准备就绪,而只会等到容器正在运行。

depends_on只会确保logstash在您的节点容器之前启动,但是再次声明,这并不意味着它将等待直到准备就绪。

您可以自己在节点上处理检查,也可以使用包装器脚本。在docker-compose文档中,他们建议使用wait-for-
it
或dockerize

你可以在这里阅读更多

定制包装

您的节点容器command可以从node index.js(或您拥有的任何容器)更改为bash wait-for-logtash.sh

#!/bin/bash

## Or whatever command is used for checking logstash availability
until curl 'http://logstash:5045' 2> /dev/null; do
  echo "Waiting for logtash..."
  sleep 1; 
done

# Start your server
node index.js


 类似资料:
  • 问题内容: 谁能让我让selenium等到页面完全加载后?我想要一些通用的东西,我知道我可以配置WebDriverWait并调用“ find”之类的东西让它等待,但我不会走那么远。我只需要测试页面是否成功加载,然后转到下一页进行测试即可。 我在.net中找到了某些内容,但无法在Java中运行。 有任何想法吗? 问题答案: 试试这个代码: 上面的代码最多等待10秒钟才能加载页面。如果页面加载时间超出

  • 问题内容: 我有一个Java ,它公开了其他线程要访问的属性: 问题是从运行到可用为止需要花费很短的时间。呼叫者可以在此之前致电并获得。我希望它们只是在初始化发生后立即阻塞,等待并获取值。(此后永远不会更改。)直到准备就绪,这将需要几毫秒的时间,因此我对这种方法感到满意。 现在,我可以做到这一点,并且有95%的机会我会做对的。但是我想知道你们所有人将如何做。有一种原始的,将做到这一点,我已经错过了

  • 我使用等待块使代理等待,直到条件为真(资源空闲)。我尝试在等待块“输入”字段中写入以下内容: 问题是,如果资源变得繁忙,代理将被困在等待块中,不会被释放,即使条件再次变为真。然后,当下一个代理进入等待块时(条件再次变为真),它将传递原本在它前面的代理,但现在被卡住了。有办法解决这个问题吗?

  • 我使用这段代码点击下拉列表: 我得到错误可能是因为有一个显示登录栏的层。之后,该元素被禁用,代码抛出异常。 是否可以实现一个等待元素不被禁用的listen?

  • 我有以下准备的一个准备好的声明失败了... 我在我的第一份准备好的声明中几乎有同样的准备,而且它进行得很好。我不确定是否我有两个准备好的声明,如果这是造成一个问题,或情况可能是什么? 现在我有个错误... 更新-可能的内部连接,像这样?

  • 问题内容: 如何让我的代码等待,直到DispatchQueue中的任务完成?是否需要任何CompletionHandler或其他东西? 我正在使用Xcode 8.2并在Swift 3中编写。 问题答案: 使用s可以实现这一点。您可以在群组和通话达到平衡时得到通知: 或者您可以等待: 注意 :阻止当前队列(在您的情况下可能是主队列),因此您必须在另一个队列上(如上面的示例代码中)以避免 死锁 。