[英]Understanding Gunicorn and Flask on Docker/Docker-Compose
[英]Understanding Docker Context: Flask could not locate app.py, when run via docker-compose
我想讓 docker-compose 啟動一個“api”服務,它是一個燒瓶應用程序。 我的文件夾結構是這樣的:
foo/backend/
Dockerfile
app.py
requirements.text
foo/
docker-compose.dev.yml
還有一個前端文件夾,稍后我將在演示為什么我認為我當前的策略應該有效時討論它。
我的后端 Dockerfile 如下所示:
foo/后端/Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.8-slim-buster
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
RUN ls
CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]
我的 docker compose 文件如下所示:
foo/docker-compose.dev.yml
version: '3.8'
services:
api:
build:
context: ./backend/
ports:
- 5000:5000
volumes:
- ./:/app
(為了清楚起見,我刪除了其他服務,稍后我會參考它們)
我使用以下命令運行 docker-compose:
docker-compose -f docker-compose.dev.yml up --build
我的問題是關於各種錯誤,其中燒瓶找不到 app.py 文件。 例如:
api_1 | Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.
我將RUN ls
命令添加到我的 Dockerfile 中,因為我不知道如何調試無法運行的 Docker 映像(這是正確的詞匯嗎?)並且后端映像將無法運行,因為它因上述錯誤而失敗。 RUN ls
命令表明存在app.py
:
Step 6/7 : RUN ls
---> Running in f5f09e4805cc
Dockerfile
__pycache__
app.py
database.conf
requirements.txt
我嘗試通過兩種方式設置環境變量:使用文件,然后在stackoverflow 答案的方向上直接作為 Dockerfile 中的ENV
屬性:
示例 1
foo/.dev.env
FLASK_APP=app.py
foo/docker-compose.dev.yml
version: '3.8'
services:
api:
build:
context: ./backend/
ports:
- 5000:5000
env_file:
- .dev.env
volumes:
- ./:/app
示例 2
(考慮文件恢復到示例 1 之前的狀態)
foo/后端/Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.8-slim-buster
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
RUN ls
ENV FLASK_APP=app.py
CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]
機器人示例導致:
api_1 | Error: Could not import 'app'.
我懷疑這個問題與運行命令的上下文有關,但我不明白為什么它不適用於backend
,而它適用於frontend
。 這是我的 docker-compose 的frontend
部分:
foo/docker-compose.dev.yml
version: '3.8'
services:
frontend:
build:
context: ./frontend/
ports:
- 8080:8080
還有我的前端 Dockerfile:
foo/前端/Dockerfile
# syntax=docker/dockerfile:1
FROM node:16
WORKDIR /app
COPY package*.json ./
RUN yarn
COPY . .
CMD [ "yarn", "run", "serve" ]
前端正確運行並保持旋轉。
如何確定運行 Dockerfile 命令的上下文? 為什么我的 python CMD
無法找到app.py
文件,在我看來,它似乎在正確的位置可見?
您有一個volumes:
塊,它用完全不同的內容覆蓋容器中的/app
目錄。 如果您刪除該塊,您將運行內置於圖像中的代碼。
一些 Docker 教程會告訴您將主機內容綁定到您的映像中。 這個想法是模擬實時開發環境,因此如果您更改應用程序代碼,則不必重新啟動應用程序。 在您的情況下,您安裝到容器中的目錄與您構建圖像的目錄不同,因此您會得到不一致的行為。 在大多數情況下,您應該能夠使用實際的本地開發環境來構建您的應用程序,然后在 Docker 中運行它(沒有volumes:
bind-mount;運行鏡像中的實際代碼)以進行集成測試和部署。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.