【发布时间】:2021-07-20 09:39:48
【问题描述】:
我想让 docker-compose 启动一个“api”服务,它是一个烧瓶应用程序。我的文件夹结构是这样的:
foo/backend/
Dockerfile
app.py
requirements.text
foo/
docker-compose.dev.yml
还有一个前端文件夹,稍后我将在演示我认为我当前的策略应该奏效的原因时讨论它。
我的后端 Dockerfile 如下所示:
foo/backend/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
我尝试过两种方式设置环境变量:使用文件,然后在a stackoverflow answer 的方向直接作为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/backend/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/frontend/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目录中的所有内容——DockerfileCOPY行放入图像中的所有内容。鉴于您所展示的内容,绑定安装的内容具有不同的目录布局(例如,顶层的backend子目录)并且它正在破坏您的应用程序。删除volumes:块有帮助吗? -
(尝试
docker-compose run api ls有和没有volumes:块以进一步调查。) -
是的!就是这样。我刚刚从 docker 介绍教程中盲目地复制了
volumes位。甚至不确定目的是什么。作为一个实验,我还尝试将 apivolumes更改为- ./backend/:/app并且也有效,但也许我应该删除该行以确保安全?无论如何,如果您想添加您的评论作为答案,我会很乐意接受它
标签: python docker flask docker-compose dockerfile