我试图封装一个简单的python应用程序,它存储了访问站点的时间。红葡萄酒似乎管用,但酒瓶拒绝吃午饭。在运行docker时,我得到了这个错误--复合构建:
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.')
这与波尔顿在https://github.com/nigelpoulton/counter-app上的反应用程序几乎完全相同。唯一的区别是我的app.py没有调用函数(if__name__==“main”)。问题是,我想在不修改app.py的情况下完成这个工作,并且只通过Dockerfile /来解决这个问题。
发布于 2021-11-15 07:53:20
关于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'
发布于 2021-11-15 09:35:26
你错过了他的app.py的最后两行,这使得应用程序监听连接。当你没有这两条线时,你的应用程序就会立即退出,你的容器也会停止。
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)我不太擅长蟒蛇。你能省去'if‘行,保持'app.run’行,这样它就能一直运行吗?
发布于 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:覆盖应该解决这个问题。
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图像,则忽略任何更改。)
https://stackoverflow.com/questions/69970373
复制相似问题