文章目录
- 前言
- 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成功安装镜像如下图: