首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >码头酒瓶+红宝石酒瓶不启动

码头酒瓶+红宝石酒瓶不启动
EN

Stack Overflow用户
提问于 2021-11-15 06:51:11
回答 3查看 228关注 0票数 0

我试图封装一个简单的python应用程序,它存储了访问站点的时间。红葡萄酒似乎管用,但酒瓶拒绝吃午饭。在运行docker时,我得到了这个错误--复合构建

web-fe_1,代码为0

下面是我的Dockerfile,docker-compose.yml & app.py

代码语言:javascript
复制
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"]

代码语言:javascript
复制
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:

代码语言:javascript
复制
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.')

这与波尔顿在https://github.com/nigelpoulton/counter-app上的反应用程序几乎完全相同。唯一的区别是我的app.py没有调用函数(if__name__==“main”)。问题是,我想在不修改app.py的情况下完成这个工作,并且只通过Dockerfile /来解决这个问题。

EN

回答 3

Stack Overflow用户

发布于 2021-11-15 07:53:20

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

代码语言:javascript
复制
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'

票数 0
EN

Stack Overflow用户

发布于 2021-11-15 09:35:26

你错过了他的app.py的最后两行,这使得应用程序监听连接。当你没有这两条线时,你的应用程序就会立即退出,你的容器也会停止。

代码语言:javascript
复制
if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

我不太擅长蟒蛇。你能省去'if‘行,保持'app.run’行,这样它就能一直运行吗?

票数 0
EN

Stack Overflow用户

发布于 2021-11-15 11:36:22

在您的Dockerfile中,您指定了一个CMD,它告诉容器flask run您的应用程序。它读取app.py文件(从$FLASK_APP)并启动一个Web服务器。但是,在docker-compose.yml文件中,您可以使用command: python app.py覆盖它,后者只运行Python,而不使用Flask。

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

代码语言:javascript
复制
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:

(为您自动撰写名为提供网络default,因此您通常不需要指定networks:volumes:声明在应用程序代码上挂载一个名为卷的Docker,因此您实际上没有在映像中运行代码。这个特殊的设置显然会在第一次工作,但是如果您再次docker-compose build图像,则忽略任何更改。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69970373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档