多阶段构建实现 Docker 加速与体积减小:含文件查看、上传及拷贝功能的 FastAPI 应用镜像构建

news2025/3/23 8:49:48

本文围绕使用 Docker 构建 FastAPI 应用镜像展开,着重介绍了多阶段构建的 Dockerfile 编写及相关操作。借助多阶段构建,不仅实现了 Docker 构建的加速,还有效减小了镜像体积。

1. Dockerfile 内容

以下是我们要使用的 Dockerfile 内容:

# 第一个阶段 - 构建应用
FROM docker.1ms.run/python:3.9 AS builder

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY requirements.txt .

# 安装依赖
RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple

# 复制项目文件到容器内
COPY . .

# 打包程序
RUN pyinstaller --onefile fastapi_detect.py

# 第二个阶段 - 最终镜像
FROM docker.1ms.run/python:3.9-slim

# 从构建阶段复制必要的文件
COPY --from=builder /app/dist/fastapi_detect /app/

# 从构建阶段复制 models 文件夹
COPY --from=builder /app/models /app/models

# 设置工作目录
WORKDIR /app

# 暴露端口
EXPOSE 8899

# 运行程序
CMD ["./fastapi_detect", "0.0.0.0", "8899"]

2. 构建 Docker 镜像

在 Dockerfile 所在的目录下,打开终端并执行以下命令来构建 Docker 镜像:

docker build -t fastapi-detect .
  • -t 参数用于给镜像指定一个名称和标签,这里将镜像命名为 fastapi-detect
  • . 表示使用当前目录下的 Dockerfile 进行构建。

3. 检查镜像是否构建成功

使用以下命令查看本地的 Docker 镜像列表:

docker images

确认 fastapi-detect 镜像是否在列表中。

4. 运行 Docker 容器

构建好镜像后,使用以下命令基于该镜像运行一个 Docker 容器:

docker run -d -p 8899:8899 --name fastapi-container fastapi-detect
  • -d 参数让容器以守护进程(后台)模式运行。
  • -p 8899:8899 将容器的 8899 端口映射到主机的 8899 端口,这样你就可以通过主机的 8899 端口访问容器内运行的 FastAPI 应用。
  • --name fastapi-container 为容器指定一个名称,方便后续管理和操作。
  • fastapi-detect 是要使用的镜像名称。

5. 验证容器是否正常运行

使用以下命令查看正在运行的容器列表:

docker ps

若 fastapi-container 出现在列表中,并且状态为 Up,则表示容器已经成功启动并正在运行。

6. 访问 FastAPI 服务

在容器成功运行后,你可以通过浏览器或工具(如 curl)访问主机的 8899 端口来验证 FastAPI 服务是否正常工作。例如,使用 curl 命令:

curl http://localhost:8899

如果服务正常,你应该能看到相应的响应信息。

7. 停止和删除容器

如果需要停止正在运行的容器,可以使用以下命令:

docker stop fastapi-container

若要删除已停止的容器,可使用:

docker rm fastapi-container

如果要删除镜像,可以使用:

docker rmi fastapi-detect

8. 将 Docker 镜像保存到本地

8.1 保存镜像到本地文件

构建好镜像之后,运用 docker save 命令将镜像保存为一个 .tar 文件:

docker save -o fastapi-detect.tar fastapi-detect
  • -o 选项用于指定输出文件的名称和路径,这里将镜像保存为 fastapi-detect.tar 文件。
  • fastapi-detect 是要保存的镜像名称。

8.2 验证保存结果

你可以查看当前目录,确认 fastapi-detect.tar 文件是否存在。

8.3 后续使用(可选)

若之后需要在其他环境中使用这个镜像,可以使用 docker load 命令将 .tar 文件加载到 Docker 中:

docker load -i fastapi-detect.tar
  • -i 选项用于指定输入文件的名称和路径,这里指定为 fastapi-detect.tar 文件。

9. 查看项目文件

9.1 查看

当容器运行后,你可以进入容器内部查看项目文件。

# 进入正在运行的容器
docker exec -it fastapi-container /bin/bash

# 在容器内部使用 ls 命令查看文件列表
ls
9.2 上传文件到容器

使用 docker cp 命令将本地文件上传到容器中。

# 将本地文件上传到容器的 /app 目录
docker cp local_file.txt fastapi-container:/app/
9.3 从容器拷贝文件到本地

同样使用 docker cp 命令将容器内的文件拷贝到本地。

# 将容器内的文件拷贝到本地当前目录
docker cp fastapi-container:/app/file_in_container.txt .

通过以上步骤,你就能轻松地基于给定的 Dockerfile 构建、运行 Docker 镜像,并将其保存到本地。希望本文对你有所帮助

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2319432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯每日一题----海底高铁

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 题目链接 P3406 海底高铁 - 洛谷https://www.luogu.com.cn/problem/P3406 解题思路 在这道题来说,主要使用的想法就是使用一维的差分数组,这道题中有两个买…

触动精灵对某东cookie读取并解密--记lua调用C语言

在Mac上构建Lua扩展模块:AES解密与Base64解码实战 今天我要分享一个实用技术:如何在Mac系统上为Lua编写和编译C扩展模块,特别是实现一个某东iOS PIN码解密功能的扩展。这对于需要在Lua环境中执行高性能计算或使用底层系统功能的开发者非常有…

【设计模式】三十二、策略模式

系列文章|源码 https://github.com/tyronczt/design-mode-learn 文章目录 系列文章|源码一、模式定义与核心思想二、模式结构与Java实现1. 核心角色2. Java代码示例 三、策略模式的五大核心优势四、适用场景五、与其他模式的对比六、最佳实践建议总结 🚀进阶版【更…

Cyberchef实用功能之-json line格式文件美化和查询

本文将介绍一下如何使用cyberchef对json line格式数据进行美化方便阅读,以及json line格式数据的批量查询操作。 之前的文章介绍了json格式数据的美化和查询,即Cyberchef实用功能之-json解析美化和转换,Cyberchef实用功能之-批量提取json数据…

计算机基础:编码03,根据十进制数,求其原码

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 (一)WIn32 专栏导航 上一篇:计算机基础:编码02,有符号数编码&#xf…

FaryGui文字shader修改,弧线排列

因项目要求,希望将文字进行标题那样的弧线排列,如下图: 对FaryGUI的文字Shader进行了一些修改,基本达到要求,shader设置如下: shader代码如下: // Upgrade NOTE: replaced _Object2World with unity_ObjectToWorld // Upgrade NOTE: replaced mul(UNITY_MATRIX_MVP,*) with Un…

C++ string的模拟实现

Hello!!大家早上中午晚上好,昨天复习了string的使用,今天来模拟实现一下string!!! 一、string的框架搭建 1.1首先我们需要一个string的头文件用来做变量、函数、类等声明;再需要一个test文件来做测试,还需…

使用LangChain实现基于LLM和RAG的PDF问答系统

目录 前言一.大语言模型(LLM)1. 什么是LLM?2. LLM 的能力与特点 二、增强检索生成(RAG)三. 什么是 LangChain?1. LangChain 的核心功能2. LangChain 的优势3. LangChain 的应用场景4. 总结 四.使用 LangChain 实现基于 PDF 的问答系统 前言 本文将介绍 …

C++实现rabbitmq生产者消费者

RabbitMQ是一个开源的消息队列系统,它实现了高级消息队列协议(AMQP), 特点 可靠性:通过持久化、镜像队列等机制保证消息不丢失,确保消息可靠传递。灵活的路由:提供多种路由方式,如…

在VMware上部署【Ubuntu】

镜像下载 国内各镜像站点均可下载Ubuntu镜像,下面例举清华网站 清华镜像站点:清华大学开源软件镜像站 | Tsinghua Open Source Mirror 具体下载步骤如下: 创建虚拟机 准备:在其他空间大的盘中创建存储虚拟机的目录&#xff0c…

又双叒叕Scrapy爬虫相关的面试题及详细解答

Scrapy是Python开发的一个快速、高层次的网络爬虫框架,专注于高效抓取网页并提取结构化数据。其核心设计基于异步处理机制,适合大规模数据采集任务。 文章目录 基础概念1. Scrapy框架的核心组件有哪些?架构与流程2. 描述Scrapy的工作流程核心组件详解3. 如何自定义Item Pipe…

使用STM32CubeMX+DMA+空闲中断实现串口接收和发送数据(STM32G070CBT6)

1.STM32CubeMX配置 (1)配置SYS (2)配置RCC (3)配置串口,此处我用的是串口4,其他串口也是一样的 (4)配置DMA,将串口4的TX和RX添加到DMA中 &#…

【视觉提示学习】3.21论文随想

. . Frontiers of Information Technology & Electronic Engineering. 2024, 25(1): 42-63 https://doi.org/10.1631/FITEE.2300389 中文综述,根据里面的架构,把视觉提示学习分成两类,一类是单模态提示学习(以vit为代表&…

(一)丶Windows安装RabbitMQ可能会遇到的问题

一丶可能会忘了配置ERLang的环境变量 二丶执行命令时报错 第一步 rabbitmq-plugins enable rabbitmq_management 第二部 rabbitmqctl status 三丶修改.erlang.cookie 文件 1.找到C盘目下的.erlang.cookie文件 C:\Users\admin\.erlang.cookie C:\Windows\System32\config\sys…

Mistral AI发布开源多模态模型Mistral Small 3.1:240亿参数实现超越GPT-4o Mini的性能

法国人工智能初创公司Mistral AI于2025年3月正式推出新一代开源模型Mistral Small 3.1 ,该模型凭借240亿参数的轻量级设计,在多项基准测试中表现优异,甚至超越了Google的Gemma 3和OpenAI的GPT-4o Mini等主流专有模型。 1、核心特性与优势 多…

springboot整合mybatis-plus【详细版】

目录 一,简介 1. 什么是mybatis-plus2.mybatis-plus特点 二,搭建基本环境 1. 导入基本依赖:2. 编写配置文件3. 创建实体类4. 编写controller层5. 编写service接口6. 编写service层7. 编写mapper层 三,基本知识介绍 1. 基本注解 T…

Qt之MVC架构MVD

什么是MVC架构: MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controll…

深度解析学术论文成果评估(Artifact Evaluation):从历史到现状

深度解析学术论文成果评估(Artifact Evaluation):从历史到现状 引言 在计算机科学和工程领域的学术研究中,可重复性和可验证性越来越受到重视。随着实验性研究的复杂性不断增加,确保研究成果可以被其他研究者验证和构建变得尤为重要。这一需…

二分查找上下界问题的思考

背景 最近在做力扣hot100中的二分查找题目时,发现很多题目都用到了二分查找的变种问题,即二分查找上下界问题,例如以下题目: 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置 它们不同于查找…

关于FastAPI框架的面试题及答案解析

FastAPl是一个现代、快速(高性能)的Web框架,用于构建API,基于Python3.7+的类型提示功能。它由Python开发者SebastianRamirez创建,并且使用了Starlette作为其核心组件以及Pydantic进行数据验证。 文章目录 基础篇1. FastAPI的核心优势是什么?2. 如何定义一个GET请求路由?…