无法让我的python应用程序在docker容器中启动

无法让我的python应用程序在docker容器中启动,python,docker,apache-kafka,docker-compose,Python,Docker,Apache Kafka,Docker Compose,我有以下python代码: 从数据管道.scraper\u处理器导入scraper处理器 def main(): 打印(“欢迎使用主功能”) sp=刮片处理器() sp.parse_消息() 如果名称=“\uuuuu main\uuuuuuuu”: main() 其中ScraperProcessor为以下类别: 来自数据管道帐户导入帐户 从输入导入列表开始 从卡夫卡进口卡夫卡消费品 类刮片处理器: 定义初始化(自): self.\u consumer=KafkaConsumer('test',

我有以下python代码:

从数据管道.scraper\u处理器导入scraper处理器
def main():
打印(“欢迎使用主功能”)
sp=刮片处理器()
sp.parse_消息()
如果名称=“\uuuuu main\uuuuuuuu”:
main()
其中ScraperProcessor为以下类别:

来自数据管道帐户导入帐户
从输入导入列表开始
从卡夫卡进口卡夫卡消费品
类刮片处理器:
定义初始化(自):
self.\u consumer=KafkaConsumer('test',bootstrap\u 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 file和main.py文件,但是当我使用
docker compose up运行整个过程时,
postgres_db和kafka服务器似乎按预期运行,但docker化的python容器立即退出:

leumiprocessor_parse-engine_1 exited with code 0
你能帮我理解我做错了什么吗

leumiprocessor_parse-engine_1已退出,代码为0

应用程序似乎没有错误,因为容器退出时代码
0
CMD
docker compose
有问题。或者可能是main.py运行并在完成后死亡的情况,为了使容器正常运行,主进程应该运行,所以

您是否可以检查在您的应用程序中是否启用tty选项(请参阅参考) docker-compose.yml文件容器是否保持运行

或者您也可以尝试在compose文件中指定CMD

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

CMD
entrypoint
的生命周期是容器的生命周期,因此,如果运行容器后python脚本死亡,容器最终将死亡。

如果Kafka未运行,此行是否会导致异常?:
self.\u consumer=KafkaConsumer('test',bootstrap\u servers='Kafka:9092'))
我猜卡夫卡还没起床。将其放入
dependens_on
并不意味着docker compose将等待Kafka运行,它将等待容器启动。在python代码中使用
wait it.sh
或添加
time.sleep(60)
,您也可以使用
docker logs container\u name
Hmm进行检查,尽管我在解析引擎容器的docker日志{container\u ID}中仍然没有看到我的任何打印内容。第一个包含函数
main
的python文件是文件名“main.py”?
ScraperProcessor
上的
parse\u message
看起来像什么?如果在接收消息时没有阻塞,程序将终止。在没有进一步信息的情况下,Python程序似乎只是正常运行到退出。
    parse-engine:
      build: .
      depends_on:
        - "kafka"
        - "postgres_db"
      command: "python main.py"