我正在嘗試容器化一個簡單的 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.')
這幾乎是相同的波爾頓的反應用上https://github.com/nigelpoulton/counter-app。與唯一的區別在于我的app.py沒有通話功能(if__name __ ==“主” )。而這個問題是我想在不修改app.py 的情況下完成這項作業,并且只能通過Dockerfile / docker -compose解決這個問題
uj5u.com熱心網友回復:
關于您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:
我geuss變化的線路app.config['REDIS_URL'] = 'redis://redis:6379/0',以app.config['REDIS_URL'] = 'http://redis:6379'
uj5u.com熱心網友回復:
你錯過了他的 app.py 的最后兩行,這使得應用程式偵聽連接。當您沒有這兩行時,您的應用程式會立即退出并且您的容器會停止。
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
我對python不是很好。你能去掉'if'行并保留'app.run'行使其始終運行嗎?
uj5u.com熱心網友回復:
在您的 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:
(Compose 會自動提供一個以default您命名的網路,因此您通常不需要指定networks:。該volumes:宣告在您的應用程式代碼上掛載了一個名為 Docker 的卷,因此您實際上并沒有在映像中運行代碼。這個特定的設定顯然會第一次作業,但如果docker-compose build再次查看影像,則忽略任何更改。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/358964.html
