Dockerfile文件构建镜像Anaconda+Python教程
文章目录
- 前言
- Dockerfile 核心模块解析**
- 一、Dockerfile基础镜像选择
- 二、系统基础配置
- 1、时区设置
- 2、镜像源替换
- 三、系统依赖安装
- 四、复制本地文件
- 五、指定路径
- 六、Anaconda环境配置
- 1、anaconda环境安装
- 2、配置虚拟环境
- 3、创建conda虚拟环境
- 4、启动和安装环境
- 七、完整dockerfile文件
前言
在深度学习与自然语言处理领域,环境配置的复杂性常常成为开发者的痛点。本文将通过一个基于CUDA 12.1的深度学习环境Dockerfile实例,详解如何高效构建可复现的容器化开发环境,并结合Dockerfile最佳实践,助你掌握企业级镜像构建技巧。
Dockerfile 核心模块解析**
一、Dockerfile基础镜像选择
可以使用网上docker镜像拉取,也可以使用本地镜像构建。我使用本地镜像构建,其代码如下:
FROM nvidia/cuda:12.1.1-cudnn8-devel-ubuntu22.04
• 关键点:选择官方CUDA镜像,确保GPU加速支持
• 最佳实践:
• 优先使用带版本标签的官方镜像(如12.1.1-cudnn8),避免latest标签
• 开发环境推荐-devel版本,包含完整开发工具链
二、系统基础配置
给系统配置时间区和镜像源设置,分别如下:
1、时区设置
# 时区设置
ENV TZ=Asia/Shanghai
RUN apt-get update && \DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata && \ln -fs /usr/share/zoneinfo/$TZ /etc/localtime && \echo $TZ > /etc/timezone
2、镜像源替换
RUN sed -i \-e 's|http://.*ubuntu.com|https://mirrors.aliyun.com|g' \/etc/apt/sources.list
• 技术细节:
• DEBIAN_FRONTEND=noninteractive:避免交互式提示,实现静默安装
• 分层构建:合并apt-get update与安装命令,防止缓存过期
• 国内镜像加速:替换阿里云源提升包下载速度
三、系统依赖安装
一般而言,需要对docker镜像进行安装,可使用如下命令完成。
RUN apt-get install -y --no-install-recommends \build-essential libreadline-dev ... && \apt-get clean && \rm -rf /var/lib/apt/lists/*
• 优化技巧:
• --no-install-recommends:仅安装必要依赖,减少镜像体积
• 清理缓存:apt-get clean与rm -rf组合减少冗余文件
四、复制本地文件
通过ADD命令实现。
# 复制项目文件
ADD nl2sql /opt/nl2sql
WORKDIR /opt/nl2sql
五、指定路径
在 Dockerfile 中,WORKDIR 指令用于设置容器内的工作目录。它定义了后续的 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令执行时的默认路径。
WORKDIR /opt/nl2sql
六、Anaconda环境配置
如果你需要配置anaconda环境安装,可以使用网络下载或本地提供,我使用本地提供。
1、anaconda环境安装
anaconda环境安装使用了本地文件,也指定安装了/home/anaconda3路径中。
ADD Anaconda3-2022.10-Linux-x86_64.sh /tmp/
RUN bash /tmp/Anaconda3-2022.10-Linux-x86_64.sh -b -p /home/anaconda3 && \rm /tmp/Anaconda3-2022.10-Linux-x86_64.sh
• 最佳实践:
• 使用ADD指令:支持本地文件直接部署(需注意与COPY的区别)
• 虚拟环境隔离:创建独立conda环境避免包冲突
2、配置虚拟环境
简单说就是将conda路径加载到~/.bashrc系统环境中。
# 配置环境变量(参考[4,5,7](@ref))
ENV PATH="/home/anaconda3/bin:$PATH"
RUN conda init bash && \conda config --set auto_activate_base false
3、创建conda虚拟环境
# 创建虚拟环境(参考[1,5,7](@ref))
RUN conda create -y -n nl2sql_env python=3.12.9
4、启动和安装环境
启动虚拟环境和安装相应库,如下:
# 安装Python依赖(在虚拟环境中安装[1,3,7](@ref))
RUN echo "conda activate nl2sql_env" >> ~/.bashrc && \/bin/bash -c "source activate nl2sql_env && \python -m pip install --upgrade pip && \pip install \langchain-qdrant \langchain_openai \langchain==0.3.19 \dmPython \vanna==0.7.6 \simplejson \llama-index \loguru==0.7.3 \dataclasses \qdrant_client \langchain_qdrant \unstructured \langchain-community \python-docx \-i https://pypi.tuna.tsinghua.edu.cn/simple \--trusted-host pypi.tuna.tsinghua.edu.cn"
七、完整dockerfile文件
我给出整体内容如下:
# 基础镜像(基于CUDA 12.1 + cuDNN 8 + Ubuntu 22.04)
FROM nvidia/cuda:12.1.1-cudnn8-devel-ubuntu22.04# ---------- 系统基础配置 ----------
# 设置时区(需显式安装tzdata[6,7](@ref))
ENV TZ=Asia/Shanghai
RUN apt-get update && \DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata && \ln -fs /usr/share/zoneinfo/$TZ /etc/localtime && \echo $TZ > /etc/timezone && \apt-get clean# 替换阿里云镜像源(完整覆盖所有仓库[9,11](@ref))
RUN sed -i \-e 's|http://$archive\|security$.ubuntu.com|https://mirrors.aliyun.com|g' \/etc/apt/sources.list# ---------- 系统依赖安装 ----------
RUN apt-get update && \apt-get install -y --no-install-recommends \software-properties-common \build-essential \libreadline-dev \libncursesw5-dev \libssl-dev \libsqlite3-dev \tk-dev \libgdbm-dev \libbz2-dev \zlib1g-dev \libffi-dev \liblzma-dev \wget \bzip2 && \apt-get clean && \rm -rf /var/lib/apt/lists/*# ---------- Anaconda3 安装 ----------
# 安装Anaconda到指定路径(参考[1,3,6](@ref))
ADD Anaconda3-2022.10-Linux-x86_64.sh /tmp/
RUN bash /tmp/Anaconda3-2022.10-Linux-x86_64.sh -b -p /home/anaconda3 && \rm /tmp/Anaconda3-2022.10-Linux-x86_64.sh# 配置环境变量(参考[4,5,7](@ref))
ENV PATH="/home/anaconda3/bin:$PATH"
RUN conda init bash && \conda config --set auto_activate_base false# 创建虚拟环境(参考[1,5,7](@ref))
RUN conda create -y -n nl2sql_env python=3.12.9# ---------- 应用部署 ----------
# 复制项目文件
ADD nl2sql /opt/nl2sql
WORKDIR /opt/nl2sql# 安装Python依赖(在虚拟环境中安装[1,3,7](@ref))
RUN echo "conda activate nl2sql_env" >> ~/.bashrc && \/bin/bash -c "source activate nl2sql_env && \python -m pip install --upgrade pip && \pip install \langchain-qdrant \langchain_openai \langchain==0.3.19 \dmPython \vanna==0.7.6 \simplejson \llama-index \loguru==0.7.3 \dataclasses \qdrant_client \langchain_qdrant \unstructured \langchain-community \python-docx \-i https://pypi.tuna.tsinghua.edu.cn/simple \--trusted-host pypi.tuna.tsinghua.edu.cn"# 设置执行权限(按需调整[5](@ref))
RUN find /opt/nl2sql -name "*.sh" -exec chmod +x {} \;
dockerfile成功安装镜像如下图:

相关文章:
Dockerfile文件构建镜像Anaconda+Python教程
文章目录 前言Dockerfile 核心模块解析**一、Dockerfile基础镜像选择二、系统基础配置1、时区设置2、镜像源替换 三、系统依赖安装四、复制本地文件五、指定路径六、Anaconda环境配置1、anaconda环境安装2、配置虚拟环境3、创建conda虚拟环境4、启动和安装环境 七、完整dockerf…...
本地部署大模型-web界面(ollama + open-webui)
一、安装ollama 二、安装部署open-webui 1、项目运行环境 (1)配置python环境—官方下载链接 可通过命令行直接更改python镜像源为阿里云镜像源: >pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/也可手动修…...
Uniapp 实现微信小程序滑动面板功能详解
文章目录 前言一、功能概述二、实现思路三、代码实现总结 前言 Uniapp 实现微信小程序滑动面板功能详解 一、功能概述 滑动面板是移动端常见的交互组件,通常用于在页面底部展开内容面板。本文将介绍如何使用 Uniapp 开发一个支持手势滑动的底部面板组件࿰…...
redis一些常用的命令(1)
启动redis redis-server /home/XXX/myredis/redis.conf 默认不是后台运行的,修改配置文件,daemonized on /var/run/redis.pid when daemonized port 6380 默认端口的6379 bind:127.0.0.1 默认是本地 连接不同的端口 redis-cli -p 6380 制…...
Java虚拟机JVM知识点(已完结)
JVM内存模型 介绍下内存模型 根据JDK8的规范,我们的JVM内存模型可以拆分为:程序计数器、Java虚拟机栈、堆、元空间、本地方法栈,还有一部分叫直接内存,属于操作系统的本地内存,也是可以直接操作的。 详细解释一下 程…...
【C++进阶四】vector模拟实现
目录 1.构造函数 (1)无参构造 (2)带参构造函数 (3)用迭代器构造初始化函数 (4)拷贝构造函数 2.operator= 3.operator[] 4.size() 5.capacity() 6.push_back 7.reserve 8.迭代器(vector的原生指针) 9.resize 10.pop_back 11.insert 12.erase 13.memcpy…...
VUE3+Mapbox-GL 实现鼠标绘制矩形功能的详细代码和讲解
以下是如何使用 Mapbox GL JS 实现鼠标绘制矩形功能的详细代码和讲解。Mapbox GL JS 是一个强大的 JavaScript 库,可以用来创建交互式地图。下面将通过监听鼠标事件并动态更新地图图层来实现这一功能。 实现步骤 初始化地图 在 HTML 文件中引入 Mapbox GL JS 库&…...
《筋斗云的K8s容器化迁移》
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 文章目录 **第一章:斗战胜佛的延迟焦虑****第二章:微服务化的紧箍咒****第三章:混沌中的流量劫持****第四章:量子筋斗的终极形态****终章&…...
面试遇到的几个问题小记20250401
一、echarts设置数据的几种方式 在 ECharts 里,设置数据存在多种方式,下面为你详细介绍: 在初始化配置项时设置数据 这是最为常见的方式,也就是在创建 ECharts 实例的时候,于配置项 option 里直接设置数据。 // 基于…...
java swing 密码框如何在获取到焦点时,输入法自动切换为英文状态
一、java swing 密码框如何在获取到焦点时,输入法自动切换为英文状态 在 Java Swing 中,JPasswordField 用于输入密码,默认情况下,输入法状态不受控。要在获取焦点时自动切换为英文状态,可以通过以下步骤实现…...
图像处理中的Transformer Block实现与解析
图像处理中的Transformer Block实现与解析 随着深度学习技术的不断进步,Transformer结构在自然语言处理领域取得了显著的成功。近年来,这种注意力机制也被引入到计算机视觉任务中,展示了其强大的表现力和效果提升能力。本文将从代码实现的角…...
基于SpringBoot的“考研学习分享平台”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“考研学习分享平台”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体功能结构图 局部E-R图 系统首页界面 …...
Web3.0隐私计算与云手机的结合
Web3.0隐私计算与云手机的结合 Web3.0隐私计算与云手机的结合,标志着从“数据垄断”向“数据自主”的范式转变。通过技术互补,两者能够构建更安全、高效且用户主导的数字生态。尽管面临技术整合和成本挑战,但随着区块链、AI和分布式存储的成…...
视觉与激光点云 融合的 三维重建算法
以下是一些结合激光点云(LiDAR)与其他数据(如图像、RGB-D等)的三维重建算法,这类方法通过融合多模态数据提升重建的精度和完整性: 1. 传统几何融合方法 (1) LiDAR 相机(RGB/LiDAR Fusion…...
Linux上位机开发实践(超越MPP去开发产品)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 对于芯片厂商来说,肯定希望客户的应用和自己的芯片绑定地越紧密越好。最好就是,他们自己成为客户的独家供应商。但是对于嵌…...
雪花算法生成的主键存在哪些问题,为什么不能使用自增ID或者UUID做MySQL的主键
MySQL 分布式架构中的主键选择:自增ID、UUID与雪花算法 为什么MySQL分布式架构中不能使用自增主键? 在分布式架构中,自增主键存在以下问题: 主键冲突风险:多个数据库实例同时生成自增主键会导致ID重复分片不均匀&am…...
SpringBean模块(二)bean初始化(2)和容器初始化顺序的比较--引入ApplicationContextInitializer
前面介绍了获取容器可以让spring bean实现ApplicationContextAware,实际也是初始化执行了setApplicationContext接口, 初始化接口还可以借助一些注解或者spring bean的初始化方法,那么他们的执行顺序是什么样的呢? 一、验证&…...
【分享】内外网文件摆渡系统:让数据传输更安全更可靠
【分享】Ftrans内外网文件摆渡系统:让数据传输更安全更可靠! 随着大数据时代的到来,数据的重要性日渐得到重视,数据作为数字经济时代下的基础性资源和战略性资源,是决定国家经济发展水平和竞争力的核心驱动力。以行业…...
2025年江苏省职业院校技能大赛 (高职组)大数据应用开发赛项任务书 (样题)
2025年江苏省职业院校技能大赛 (高职组)大数据应用开发赛项任务书 (样题) 背景描述:任务A:离线数据处理(35分)子任务一:数据抽取子任务三:指标计算 任务B&…...
前端学习记录之HTML
1. 网页 1.1 什么是网页 网站是指在因特网上根据一定的规则,使用HTML等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”,通常是HTML格式的文件,它要通过浏览器来阅读 网页是构成网站的基本元素。它通常由图片,…...
解释一下Unity碰撞的触发条件
Unity中碰撞的触发条件主要与物体的碰撞体(Collider)和刚体(Rigidbody)组件有关。具体来说,Unity的物理引擎会根据物体的配置来检测碰撞(Collision)和触发器(Trigger)事件…...
手机显示5GA图标的条件
最近有星友问在什么情况下才能显示5G-A?虽然这个我也不知道,但是我有几个运营商的5G终端白皮书,从上面就可以找到答案。 如上是几个运营商显示5G-A的条件,基本上考虑的都是3CC的情况,联通还有考虑200M CA 2CC的场景&am…...
Spring Boot 实现文件秒传功能
前言 在开发Web应用时,文件上传是一个常见需求。然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余。此时可以使用文件秒传技术通过识别重复文件,实现瞬间完成上传的效果,大大提升了用户体验…...
使用AOP技术实现Java通用接口验签工具
一、背景 在给第三方提供接口时,我们需要对接口进行验签。具体来说,当外部系统调用我们的接口时,请求中需要携带一个签名,我们接收到请求后,会解析数据并校验签名是否正确,以确保请求的合法性和安全性。 为了在不同项目中方便地使用这一功能,我们将签名校验规则封装成一…...
Foldseek快速蛋白质结构比对
1. 下载和安装 Foldseek 如果只是单个蛋白质结构的序列比对,我们只需要用Foldseek 的网站服务 https://search.foldseek.com/search 上传我们的蛋白质结构并选择想要进行比对的数据库即可,这里不做重点讲解。做生物信息学研究,我们难免需要批…...
JAVA设计模式之适配器模式《太白金星有点烦》
太白金星握着月光凝成的鼠标,第108次检查南天门服务器的运行日志。这个刚从天枢院调来的三等仙官,此刻正盯着瑶池主机房里的青铜鼎发愁——鼎身上"天地同寿"的云纹间,漂浮着三界香火系统每分钟吞吐的十万条功德数据。看着居高不下的…...
w2ui 水平滚动移动 虚拟列 数据丢失
https://w2ui.com/web/docs/1.5/w2grid.disableCVS https://github.com/vitmalina/w2ui/issues/1398 解决方案来源 问题现象: 窗口缩小 导致多列 出现水平滚动,滚动时触发本地样式重绘,导致record undefined,从而引发多列报错 解决方案: 使用 disableCVS : true 一次加载到d…...
aarch64-none-elf-gcc与aarch64-linux-gnu-gcc
1. 场景描述 在Ubuntu 24.04.1 LTS x86_64架构下交叉编译能跑在aarch64架构下裸机程序,遇到缺aarch64-none-elf-gcc的情况,做此记录。 2. aarch64-none-elf-gcc与aarch64-linux-gnu-gcc 运行环境 aarch64-none-elf-gcc 生成的代码是 裸机程序…...
MySQL篇(一):慢查询定位及索引、B树相关知识详解
MySQL篇(一):慢查询定位及索引、B树相关知识详解 MySQL篇(一):慢查询定位及索引、B树相关知识详解一、MySQL中慢查询的定位(一)慢查询日志的开启(二)慢查询日…...
【清华大学】DeepSeek政务应用场景与解决方案
目录 一、政务数字化转型三阶段演进二、人工智能政务应用场景四大方向 三、技术方案核心技术 四、解决方案案例1. 公文写作2. 合同协议智能审查3. 行政执法4. 就业指导 五、风险及对策六、落地大四步法七、未来发展展望AI职业替代逻辑空间智能与具身智能人机共生 一、政务数字化…...
