【问题标题】:Docker Container Exits on Code 0 After Initial Code Execution初始代码执行后,Docker 容器在代码 0 上退出
【发布时间】:2019-06-18 22:04:51
【问题描述】:

我在创建 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。不幸的是,这是我在网上找到的唯一可能使容器在执行后保持运行的东西。

[码头工人撰写]

  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 up 时,它会写入正确执行每个步骤的输出,然后到达结束并以代码 0 退出。检查 docker ps 表明它实际上不再运行。

【问题讨论】:

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


    【解决方案1】:

    docker container 可以退出的原因有很多。比如被OOM杀手等杀死。

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

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

    保持容器活动的诀窍是保持主进程繁忙。也就是说,脚本/程序不能退出。

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

    或者,您可以使用像supervisord 这样的进程监控程序,或者您可以编写另一个python 脚本来协调脚本之间的执行。至于后者,subprocess lib 可能会有很好的帮助。

    【讨论】:

    • 这是有道理的,我相信我正在运行的脚本正在启动另一个在后台循环的脚本。如何配置 docker 容器以关注另一个脚本的代码执行,而不是启动它的那个?我没有编写原始代码,也不了解 Python,因此对代码进行基本修改将是行不通的,我不知道该怎么做。
    • 你可以看看supervisord。这是一个有助于启动和监控您的流程的流程。例如,当您的脚本崩溃时它会重新启动它,所以它非常好。 tail -f 有效,但这不是最佳实践,因为如果tail 过早死亡,容器将exit 或者当您的script 崩溃时,container 将成为zombie 容器什么都不做。而supervisord 会为您重新启动它。 supervisord.org
    • 说得好!今晚我会看看 supervisord ,看看我是否可以在下周初让它工作。感谢您的建议,听起来这样会更好。
    【解决方案2】:

    可能不是最好的解决方案,但我最终使用bash -c 在 docker-compose 文件中的命令选项上运行多个命令。最后,我跑了tail -f /path/to/logfile。似乎暂时有效,至少在我找到更好的解决方案之前。可能会联系原始开发人员,看看他们是否愿意将 docker 信息添加到他们的东西中,以便让任何想要部署它的人更容易。他们也许能够修改他们的代码以在容器中更好地运行。

    【讨论】:

    • 我建议记下这个答案,因为它不是一个合适的解决方案。也不是最好的解决方法。请参阅我上面关于原因的评论,
    猜你喜欢
    • 2018-12-13
    • 2019-12-27
    • 2018-10-08
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    相关资源
    最近更新 更多