【问题标题】:Cant get my python app to start in a docker container无法让我的 python 应用程序在 docker 容器中启动
【发布时间】:2020-01-27 02:59:17
【问题描述】:

我有以下 python 代码:

from data_pipeline.scraper_processor import ScraperProcessor


def main():
    print("Welcome to The Main function")
    sp = ScraperProcessor()
    sp.parse_message()


if __name__ == "__main__":
    main()

其中 ScraperProcessor 是以下类:

from data_pipeline.Account import Account
from typing import List
from kafka import KafkaConsumer


class ScraperProcessor:
    def __init__(self):
        self._consumer = KafkaConsumer('test',bootstrap_servers='kafka:9092')

我有以下 Dockerfile:

FROM python:3.5-alpine3.9
ADD . /app
WORKDIR /app
RUN pip install pipenv
RUN pipenv install --system --deploy --ignore-pipfile
CMD ["python","main.py"]

和以下 docker compose 文件:

  version: '3.1'

  services:
    postgres_db:
      image: postgres
      restart: always
      environment:
        POSTGRES_USER: admin
        POSTGRES_PASSWORD: admin
        POSTGRES_DB: default_db
      ports:
        - 54320:5432
    zookeeper:
      image: wurstmeister/zookeeper
      ports:
        - "2181:2181"
    kafka:
      image: wurstmeister/kafka
      ports:
        - "9092:9092"
      environment:
        KAFKA_ADVERTISED_HOST_NAME: kafka
        KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
        KAFKA_CREATE_TOPICS: "test:1:1"
      volumes:
        - /var/run/docker.sock:/var/run/docker.sock
    parse-engine:
      build: .
      depends_on:
        - "kafka"
        - "postgres_db"

我在项目的根目录中拥有所有三个文件 - Dockerfile、docker-compose 文件和 main.py 文件,但是当我使用 docker-compose up 运行整个文件时,postgres_db 和 kafka 服务器似乎上升了正如预期的那样,但 dockerized python 容器立即退出:

leumiprocessor_parse-engine_1 exited with code 0

你能帮我理解我在这里做错了什么吗?

【问题讨论】:

  • 如果 Kafka 没有运行,这条线会导致异常吗?:self._consumer = KafkaConsumer('test',bootstrap_servers='kafka:9092') 我的猜测是 Kafka 还没有运行。把它放在depends_on 中并不意味着 docker compose 会等到 Kafka 运行,它会等到该容器启动。
  • 使用wait-for-it.sh或在你的python代码中添加time.sleep(60),你也可以用docker logs container_name检查
  • 嗯,尽管我在解析引擎容器的 docker logs {CONTAINER_ID} 中仍然看不到任何打印件
  • 第一个包含函数main-的python文件是文件名“main.py”吗?
  • parse_message 上的 ScraperProcessor 是什么样的?如果它没有阻止接收消息,则程序将终止。如果没有更多信息,Python 程序似乎只是正常运行到退出。

标签: python docker apache-kafka docker-compose


【解决方案1】:

leumiprocessor_parse-engine_1 以代码 0 退出

似乎应用程序没有错误,因为容器退出代码0CMDdocker-compose 有问题。或者可能是您的 main.py 在完成后运行并死掉的情况,以使您的容器启动并运行主进程应该运行,所以

您能否检查一下您是否启用了 tty 选项(请参阅参考资料) docker-compose.yml 文件容器一直在运行吗?

    parse-engine:
      build: .
      depends_on:
        - "kafka"
        - "postgres_db"
      tty: true

Docker-Compose exited with code 0

或者您也尝试在撰写文件中指定 CMD

    parse-engine:
      build: .
      depends_on:
        - "kafka"
        - "postgres_db"
      command: "python main.py"

CMDentrypoint的生命周期就是容器的生命周期,所以万一你的python脚本在运行容器后死掉了,容器最终也会死掉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多