【问题标题】:docker container seems to have failing /etc/hosts until an _interactive_ docker start在 _interactive_ docker start 之前,docker 容器似乎失败了 /etc/hosts
【发布时间】:2019-05-29 15:26:47
【问题描述】:

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

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

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

我尝试过但不起作用的方法:

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

但是如果我在我的脚本中抛出 /bin/bash -i 并带有一个回显来说明要输入什么命令,它就会起作用!

我正在使用:

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

我必须得到我的管理层的同意才能分享更多的小sn-ps代码。

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

容器内的错误消息(来自 docker logs -f 服务)如下所示: elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout 由 - ReadTimeoutError(HTTPConnectionPool(host=u'elasticsearch', port=9200): Read timed out. (read timeout=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

脚本本身运行良好,但“服务”在它应该退出之前退出。

谢谢!

【问题讨论】:

  • 脚本和确切的错误消息可能会帮助其他人帮助您。如果不能共享特定代码,几乎总有解决方案to create a minimal reproducible example
  • 谢谢。我正在研究 SSCCE。
  • 我不确定我是否正确理解了这个问题,但我认为您要使用的是 docker-compose up -d elasticsearch 而不是 docker-compose start elasticsearch
  • 我认为这个问题和这个one有关
  • @user7440787 我在容器第一次启动时使用“up”,在容器的后续启动时使用“start”。

标签: linux bash docker elasticsearch networking


【解决方案1】:

如果我理解正确,您希望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中放置一个睡眠语句或使用31746182中的解决方案

【讨论】:

  • 是的,“服务”依赖于elasticsearch。关于环境变量:这是我们必须考虑的事情。我们有我们的开发系统,我们在 127.0.0.1 上有弹性搜索,我们的生产环境使用弹性搜索是别的东西。因此,如果我们可以为不同的系统设置不同的环境变量值,那可能会奏效——尤其是当它确实意味着经常更改我们的 docker yaml 时。
  • 有时名称解析有效,有时无效,这仍然很奇怪。 :-S
【解决方案2】:

似乎 docker-compose 有时真的想在 pty 上运行,而不是直接/正常地从脚本中运行。我想这可能与我正在启动的容器的内容有关,而不是 docker 本身。

不管你信不信,跑起来就像(例如):

script -q -c "docker-compose up -d \"elasticsearch\"" /dev/null

...解决了问题。

很奇怪,我知道,但我目前不打算找出原因。我很高兴它能正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-09
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多