初始代码执行后,Docker容器在代码0上退出

时间:2019-01-25 04:43:08

标签: python-2.7 docker docker-compose dockerfile isilon

我在旋转的Docker容器上遇到了一些困难。我修改了一些代码,将EMC Isilon的指标导入到InfluxDB数据库中以在Grafana中使用。我设法使代码在容器中运行,但是在初始执行后,容器立即以代码0退出。我正在动态学习Docker,因此很可能我遗漏了一些明显的东西(请注意,绝对会接受建议,但如果有明显的事情请不要把我分开。我知道链接是忌讳的,但我将链接到原始文章和所用的git repo(请让我知道是否有更好的方法来处理该问题)。

文章: https://community.emc.com/blogs/keith/2017/01/26/isilon-data-insights-connector--do-it-yourself-isilon-monitoring

Git回购: https://github.com/Isilon/isilon_data_insights_connector

我尝试在已配置的docker-compose服务上设置stdin_open和tty。不幸的是,这是我在网上发现的唯一使容器在执行后仍能运行的东西。

[docker-compose]

  isilonscan:
    stdin_open: true
    tty: true
    build:
      args:
        - http_proxy=http://*****:3128
      context: ./Isilonscan/isilonscan-context
      dockerfile: Dockerfile
    volumes:
      - ./Isilonscan/isilonscan-data:/opt/isilon_data_insights_connector
      - ./Isilonscan/isi_data_insights_d.cfg:/opt/isilon_data_insights_connector/isi_data_insights_d.cfg
    depends_on:
      - influxdb
    command: ["python", "/opt/isilon_data_insights_connector/isi_data_insights_d.py", "start", "--config=/opt/isilon_data_insights_connector/isi_data_insights_d.cfg"]

[Dockerfile]

FROM python:2
WORKDIR /usr/src/app
COPY isilon-exporter /opt/isilon_data_insights_connector
RUN apt-get install git && \
cd /opt && \
git clone https://github.com/Isilon/isilon_data_insights_connector.git && \
cd ./isilon_data_insights_connector && \
#pip install --upgrade pip && \
#pip install --upgrade setuptools && \
pip install -r requirements.txt && \
apt-get remove git -y && \
apt-get clean all -y
ENTRYPOINT ["python", "/opt/isilon_data_insights_connector/isi_data_insights_d.py", "start", "--config=/opt/isilon_data_insights_connector/isi_data_insights_d.cfg"] 

预期: 该代码应在新行上运行并结束。每30秒(或配置的时间间隔),容器应轮询Isilon以获取指标并将其粘贴到InfluxDB(不同的容器)中。

实际: 在启动docker-compose时,它会正确写入执行每个步骤的输出,然后到达结尾并以代码0退出。检查docker ps表明它实际上不再运行。

2 个答案:

答案 0 :(得分:0)

码头工人container可以退出的原因有很多。例如被OOM杀手等杀害。

由于您的container将退出报告为正常退出(返回代码为0)。运行脚本isi_data_insights_d.py的进程很可能由于执行了所有必需的代码而停止。

由于.py脚本中没有任何可运行的内容,因此该过程将退出,导致容器也退出。

使容器保持活动状态的技巧是使主进程保持繁忙。也就是说,脚本/程序不得退出。

您可能要做的是用loop包装整个代码,然后让进程进入sleep一段时间,然后醒来再次执行相同的代码。

或者,您可以使用supervisord之类的进程监视程序,也可以编写另一个python脚本来协调脚本之间的执行。至于后者,subprocess库可能是一个很好的帮助。

答案 1 :(得分:0)

可能不是最好的解决方案,但是我最终使用bash -c在docker-compose文件的command选项上运行了多个命令。最后,我运行了tail -f /path/to/logfile。似乎暂时奏效了,至少直到找到更好的解决方案为止。可以与原始开发人员联系,看看他们是否愿意将docker信息添加到自己的东西中,以使希望部署它的任何人都可以更轻松地进行操作。他们可能能够修改其代码以在容器中更好地运行。