【发布时间】:2019-05-29 15:26:47
【问题描述】:
如果我在交互式终端中“docker-compose start service”(不是 -it,而是在主机上交互式运行的 bash),我的服务就会愉快地初始化。
但是,如果我将相同的命令放在 shell 脚本中,它就会失败。
我怀疑问题是通过 /etc/hosts 进行名称解析;它似乎以交互方式工作,但由于某种原因不在脚本中。我希望容器能够看到主机的 /etc/hosts 中定义的名称。虽然我使用的是 Linux Mint 19.1,但我需要它才能在 Windows、Mac 和 Linux 上运行。
我尝试过但不起作用的方法:
- 添加睡眠 - 长达 10 分钟
- 检查环境变量差异
- 在 tcsh 而不是 bash 下运行命令
- 使用 /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