簡體   English   中英

了解 Docker 上下文:通過 docker-compose 運行時,Flask 找不到 app.py

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM