(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件

如何编写一个用于构建python web项目镜像的dockerfile文件

一个用于构建python webdocker 镜像的文件需要包含以下文件:Dockerfilemain.pydocker-compose.ymlrequirements.txt。其中,main.py为python代码文件(命名不一定为main.py),docker-compose.yml 为非必须的文件,但是有了会更好,它整合了构建镜像的命令和创建容器的参数。

编写dockerfile,单阶段构建:

dockerfile 复制代码
# Step 1: 选择基础镜像
FROM python:3.11-slim

# Step 2: 设置容器内的工作目录
WORKDIR /app

# Step3: 将 requirements 文件复制到容器中
COPY requiredments.txt .

# Step4: 安装依赖项
RUN pip install --no-cache-dir -r requiredments.txt

# Step5: 将应用程序代码复制到容器中
COPY ./app ./app

# Step6: 声明应用程序运行的端口,这里仅仅是声明而不是实际暴露端口
EXPOSE 8000

# Step7: 定义运行应用程序的命令
CMD ["uvicorn", "app.main:app","--host","0.0.0.0","--port","8000"]
  • python:3.11-slim 是一个轻量级python:3.11镜像。python:3.11-slim以Debian 官方 slim 变体(当前是 Debian Bookworm slim)作为基础镜像,再在上面安装 Python 3.11 及其最小依赖。

  • 8000是Uvicorn默认用于运行FastAPI应用程序的端口。

  • 拓展:

    dockerfile 复制代码
    RUN apt-get update && apt-get install -y --no-install-recommends \
        build-essential \
     && rm -rf /var/lib/apt/lists/*

    RUN 是 Dockerfile 的关键字,它告诉 Docker:"在镜像构建阶段,启动一个临时容器,执行后面的 shell 命令;然后把执行后的文件系统改动固化成一层新的镜像层"。

多阶段构建:

python 复制代码
# ----------- 构建阶段 -----------
FROM python:3.11-slim AS builder

# 1. 安装编译依赖(后续可全部丢弃)
RUN apt-get update && apt-get install -y --no-install-recommends \
        build-essential \
    && rm -rf /var/lib/apt/lists/*

# 2. 创建并激活虚拟环境
ENV VIRTUAL_ENV=/opt/venv
RUN python -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"

# 3. 安装 Python 依赖
WORKDIR /build
COPY requirements.txt .
RUN pip install --upgrade pip && \
    pip install --no-cache-dir -r requirements.txt

# ----------- 运行阶段 -----------
FROM python:3.11-slim

# 1. 复制虚拟环境(无编译器,体积更小)
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

# 2. 创建非 root 用户
RUN useradd -m -u 1001 appuser

# 3. 复制源码
WORKDIR /app
COPY ./app ./app

# 4. 权限 & 端口
RUN chown -R appuser:appuser /app
USER appuser
EXPOSE 8000

# 5. 启动命令
# 默认监听 0.0.0.0:8000,workers 可根据 CPU 核数调整
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "1"]

如何编写 docker-compose.yml 文件

bash 复制代码
version: "3.8"
services:
	api:
		build: .
		ports:
		  - "8000:8000"
		volumes:
		  - ./app:/app/app  # 代码热挂载
		environment:
		  - ENV=dev
		command: >
		  sh -c "uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload"
相关推荐
Ivanqhz8 小时前
SVD++算法
java·服务器·网络·深度学习·神经网络
GPU实战笔记9 小时前
云端 Python 开发:JupyterLab 还是 VS Code Remote-SSH?
python·vs code·jupyterlab·remote-ssh·远程开发
linux_cfan9 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
狗狗狗狗狗乐啊9 小时前
搭一个 AI 对话工作台 AChat:从 0 到可用的完整记录(一)
python·react.js·ai编程
qq_2518364579 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
kyriewen9 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程
caoerzhong10 小时前
JeeWMS 开源仓库管理系统全景解读:一套 Java WMS 如何把 WMS/OMS/BMS/TMS 装进同一个系统
java·开源
曹牧10 小时前
Java集合框架:List、ArrayList、Map 和 HashMap
java
白猫不黑10 小时前
Python实现简易Web弱口令爆破与防护方案
python·web安全·计算机·网络安全·黑客·信息安全·渗透测试
顾城猿10 小时前
STOMP 协议
java