我正在设置用于开发的 fastapi compose.yaml 文件。
这是我的项目的简化布局:
Dockerfile -> 大小优化:170MB
# The builder image, used to build the virtual environment
FROM python:3.11-bullseye as builder
# Install package manager
RUN pip install poetry==1.7.1
# Define environment
ENV POETRY_NO_INTERACTION=1 \
POETRY_VIRTUALENVS_IN_PROJECT=1 \
POETRY_VIRTUALENVS_CREATE=1 \
POETRY_CACHE_DIR=/tmp/poetry_cache
# Set work directory
WORKDIR /app
# Copy project dependencies
COPY pyproject.toml poetry.lock ./
# Install production dependencies only and remove poetry cache directory
RUN poetry install --without dev --no-root && rm -rf $POETRY_CACHE_DIR
# The runtime image, used to run the service
FROM python:3.11-slim-bullseye as runtime
# Set virtual environment path and add it to the system Path
ENV VIRTUAL_ENV=/app/.venv \
PATH="/app/.venv/bin:$PATH"
# Copy project dependencies from builder stage
COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV}
# Copy project code
COPY app/ /app/
# Run service
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
在 debian 容器中生成的布局是相同的,所以一切都很好,当我运行容器时,它部署了一个运行完美的 fastapi 服务器!
我想创建一个开发环境来监视我的代码并在每次更改时重新加载服务器。
为此,我创建了以下 compose.yaml:
services:
api:
image: pws
build:
context: .
dockerfile: Dockerfile
restart: on-failure
ports:
- "80:80"
volumes:
# - ./app/:/app # I have tried many combinations of this line
- ./app/:/app/
command: ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--reload"]
问题是,当未指定“卷”时,运行“docker compose up”运行良好,但目前我尝试包含它,但出现了问题:
错误: 来自守护进程的错误响应:无法为容器创建任务:无法创建 shim 任务:OCI 运行时创建失败:runc 创建失败:无法启动容器进程:exec:“uvicorn”:在 $PATH 中找不到可执行文件:未知
我找到了使用 docker compose watch 的解决方法,但仍然对使用“卷”进行绑定挂载时发生的情况感到好奇
services:
api:
image: pws
build:
context: .
dockerfile: Dockerfile
container_name: pws
environment:
- WATCHFILES_FORCE_POLLING=true
restart: on-failure
ports:
- "80:80"
develop:
watch:
- action: sync
path: ./app/
target: /app/
ignore:
- .venv/
command: ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80", "--reload"]