【问题标题】:Docker | Flask + Redis | Flask not launching码头工人 |烧瓶+Redis |烧瓶没有启动
【发布时间】:2021-12-26 10:08:30
【问题描述】:

我正在尝试将一个简单的 python 应用程序容器化,该应用程序存储一个网站的访问时间。 Redis 似乎可以工作,但 Flask 拒绝吃午饭。我在运行 docker-compose up --build 时收到此错误:

web-fe_1 以代码 0 退出

以下是我的 Dockerfile、docker-compose.yml 和 app.py

FROM python:3.6-alpine
ENV FLASK_APP app.py
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD [ "flask","run","--host=0.0.0.0","--port=5000"]

version: "3.5"
services:
  web-fe:
    build: .
    command: python app.py
    ports:
      - target: 5000
        published: 5000
    networks:
      - counter-net
    volumes:
      - type: volume
        source: counter-vol
        target: /code
  redis:
    image: "redis:alpine"
    networks:
      counter-net:

networks:
  counter-net:

volumes:
  counter-vol:

import os

from flask import Flask
from flask_redis import FlaskRedis

app = Flask(__name__)
app.config['REDIS_URL'] = 'redis://redis:6379/0'

redis = FlaskRedis(app)


@app.route('/')
def counter():
    return '{0} {1} {2}'.format('Hello! You have visited me:',str(redis.incr('web2_counter')),' times.')

这几乎与 Poulton 在 https://github.com/nigelpoulton/counter-app 上的反应用程序相同 .. 唯一不同的是我的 app.py 没有调用函数 (if__name__== "ma​​in” ).. 问题是我想在不修改 app.py 的情况下完成这项工作,并且只能通过 Dockerfile / docker-compose

【问题讨论】:

    标签: python docker flask redis


    【解决方案1】:

    关于您的docker-compose.yml 定义网络不是必需的,因为bridge 网络已经是默认网络。您可以将docker-compose.yml 更新为:

    version: "3.5"
    services:
      web-fe:
        build: .
        command: python app.py
        ports:
          - target: 5000
            published: 5000
        volumes:
          - type: volume
            source: counter-vol
            target: /code
      redis:
        image: "redis:alpine"
    
    volumes:
      counter-vol:
    

    我想把app.config['REDIS_URL'] = 'redis://redis:6379/0' 换成app.config['REDIS_URL'] = 'http://redis:6379'

    【讨论】:

    • 不工作。还是一样..
    【解决方案2】:

    你错过了他的 app.py 的最后两行,这使得应用程序监听连接。如果您没有这 2 行,您的应用会立即退出并且您的容器会停止。

    if __name__ == "__main__":
        app.run(host="0.0.0.0", debug=True)
    

    我对 python 不是很好。您可以省略“if”行并保留“app.run”行以便它始终运行吗?

    【讨论】:

      【解决方案3】:

      在您的 Dockerfile 中,您指定一个 CMD 告诉容器 flask run 您的应用程序。这会读入app.py 文件(来自$FLASK_APP)并启动一个Web 服务器。但是,在 docker-compose.yml 文件中,您使用 command: python app.py 覆盖它,它只运行 Python 文件,没有 Flask 包装器。

      解决此问题的一种方法是使用@HansKillian's approach 使app.py 调用app.run() 本身,但从docker-compose.yml 文件中删除所有不必要的部分会更容易。尤其是删除 command: 覆盖应该可以解决这个问题。

      version: "3.5"
      services:
        web-fe:
          build: .
          # command: python app.py  <-- CMD in the Dockerfile
          ports:
            - target: 5000
              published: 5000
          # networks:               <-- Compose provides a "default" network
          #   - counter-net
          # volumes:                <-- Code is in the image and does not need
          #   - type: volume            to be hidden with a volume
          #     source: counter-vol
          #     target: /code
        redis:
          image: "redis:alpine"
          # networks:               <-- Compose provides a "default" network
          #   counter-net:
      
      # networks:                   <-- Unused
      #   counter-net:
      
      # volumes:                    <-- Unused
      #   counter-vol:
      

      (自动为您编写provides a network,命名为default,因此您通常不需要指定networks:volumes: 声明在您的应用程序代码上安装了一个 Docker 命名卷,因此您实际上并不是运行图像中的代码。这个特定的设置显然会在第一次工作,但如果您再次docker-compose build 图像,则忽略任何更改。)

      【讨论】:

        猜你喜欢
        • 2011-12-15
        • 1970-01-01
        • 2019-02-10
        • 1970-01-01
        • 1970-01-01
        • 2018-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多