linux - 在 _interactive_ docker 启动之前,docker 容器似乎有失败的/etc/hosts

标签 linux bash docker elasticsearch networking

如果我在交互式终端中“docker-compose start service”(不是 -it,而是在主机上交互式运行的 bash),我的服务会愉快地初始化。

但如果我将相同的命令放入 shell 脚本中,它就会失败。

我怀疑问题是通过/etc/hosts 进行名称解析;它似乎可以交互工作,但由于某种原因不能在脚本中工作。我希望容器能够看到主机的/etc/hosts 中定义的名称。尽管我使用的是 Linux Mint 19.1,但我需要它才能在 Windows、Mac 和 Linux 上工作。

我试过但没有用的东西:

  1. 增加 sleep - 长达 10 分钟
  2. 检查环境变量差异
  3. 在 tcsh 而不是 bash 下运行命令
  4. 使用/usr/bin/script -c 在伪 tty 中运行命令

但是,如果我在我的脚本中抛出一个/bin/bash -i,并附上一个说明要键入什么命令的 echo ,它就会起作用!

我正在使用:

docker version 18.09.6, build 481bc77
docker-compose version 1.24.0, build 0aa59064

我必须得到我的管理部门的同意才能分享更多的代码片段。

为了自动化,我希望服务通过 docker-compose up -d 或至少 docker-compose start - 在脚本中启动。

容器内的错误消息(来自 docker logs -f service)如下所示: elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectionPool(host=u'elasticsearch', port=9200): 读取超时。(读取超时=10))

我有时会看到 elasticsearch 的负载很高,这似乎有点奇怪。我所说的高是指在 8 核上高达 490%(可能算上超线程)。更常见的是它下降了 5-15% 左右。

这是一个 SSCCE:

#!/bin/bash

set -eu
set -o pipefail
set -x

docker stop elasticsearch || true
docker-compose start elasticsearch

# Give elasticsearch some time to come up.
# Normally I use a small REST client that calls ES until it starts responding - but that wouldn't be self-contained.
sleep 120

docker stop service || true
docker-compose start service

脚本本身运行正常,但随后“服务”提前退出。

谢谢!

最佳答案

如果我理解正确,您希望 elasticsearch 容器为您的 service 容器提供服务(即两个容器相互联系)因此,service 容器需要知道 elasticsearch 的 IP 地址。

在这种情况下,docker-compose 将管理容器地址,您需要做的是将该信息作为环境变量存储在服务容器中。它的优点是,您可以使用相同的命令(只需 docker-compose up -d)启动两个容器。例如:

services:
  elasticsearch:
      image: YOUR_ELASTICSEARCH_IMAGE
      ports:
        - 9200:9200
  service:
      image: YOUR_SERVICE_IMAGE
      environment:
          - ELASTICSEARCH_HOST=elasticsearch

如果容器之间存在依赖关系并且 elasticsearch 容器需要一些时间来启动,那么您可以在启动时在 service 中放置一个 sleep 语句,或者使用31746182 中的解决方案

关于linux - 在 _interactive_ docker 启动之前,docker 容器似乎有失败的/etc/hosts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56363968/

相关文章:

python - 当 python 指向 python3 时,谷歌云 sdk 不工作

linux - node.js 提示 "The ChromeDriver could not be found on the current PATH"即使 chromedriver 在路径上

linux - Bash 限制父脚本命令行参数传递给子脚本参数

linux - 在其他 IP 地址上测试 SSL 证书

linux - 如何监控长时间运行的命令的进度?

bash - 如何停止执行可能已获取或直接执行的脚本

docker - Docker Run 退出代码的权威列表是什么?

python - Github Action flake8 失败 : f-string is missing placeholders

regex - 在bash中替换密码参数值

php - 在双 nginx 反向代理中正确处理 request_uri?