由于需要在Docker上跑深度学习项目,方便后续移植和管理,我在Windows上配置好了Docker,这篇是我配置的过程 Docker Desktop 安装与配置全攻略:从零开始,轻松玩转容器化。但是在后续的镜像构建和项目运行,又碰到了不少问题,这篇文章主要介绍一下镜像构建跑起来项目的过程,以及解决对应问题的方法。

一、镜像构建(Image build)

这里需要提及一个概念 开发模式生产模式,这两种的build方式是完全不同的。
开发模式 = 代码在本地,容器只提供环境(改代码立刻生效)
生产模式 = 代码打包进镜像,镜像就是完整项目(不可随意修改,稳定运行)

1、Dockerfile

Image build的主要是使用Dockerfile文件去完成构建的,下面给一个开发模式和生产模式的例子:

开发模式

# 使用官方Python镜像作为基础镜像
FROM python:3.10
 
# 设置工作目录
WORKDIR /app

# 将当前目录内容复制到容器内的/app目录
COPY requirements.txt .
 
# 安装项目依赖
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 安装 OpenCV 必须的系统依赖(修复 libGL 错误)
RUN pip install opencv-python-headless -i https://pypi.tuna.tsinghua.edu.cn/simple

# 暴露项目运行的端口
EXPOSE 5000

# 解决中文编码
ENV PYTHONIOENCODING=utf-8

生产模式

# 使用官方Python镜像作为基础镜像
FROM python:3.10
 
# 设置工作目录
WORKDIR /app

# 将当前目录内容复制到容器内的/app目录
COPY . /app
 
# 安装项目依赖
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 安装 OpenCV 必须的系统依赖(修复 libGL 错误)
RUN pip install opencv-python-headless -i https://pypi.tuna.tsinghua.edu.cn/simple

# 暴露项目运行的端口
EXPOSE 5000
 
# 启动命令(根据项目类型调整,例如Flask、Django等)
CMD ["python", "main.py"]

# 解决中文编码
ENV PYTHONIOENCODING=utf-8

区别

文件上的区别就是 COPY . /app 是将整个项目都拷贝到Image中,而 COPY requirements.txt . 是值拷贝requirments.txt文件,以及在生成模式下使用 CMD [“python”, “main.py”] 来快速启动项目。

2、Image build和运行进行

构建镜像简单只需要在有Dockerfile的文件夹下使用命令行运行下面的指令就行,需要注意的是image_name的后面有一个空格+. ,这个表示当前读取当前路径下的的Dockerfile文件,如果Dockerfile不在当前路径下,可以更改路径。

docker build -t image_name .

运行也分开发模式和生产模式:

开发模式

docker run -it --rm -v ${PWD}:/app -p 5000:8080 image_name python main.py

–rm :容器退出后自动删除,不会留下垃圾容器
-v :挂载卷(volume)
${PWD} :你当前在电脑上的工作目录
:/app :容器内部的 /app 目录
-p 5000:8080 :本机 5000 端口 → 映射到 → 容器 8080 端口(实际访问的是:容器内的 8080 服务)

生产模式

docker run -p 5000:8080 image_name

同上

二、存在问题及解决方法

1、“docker build“ requires exactly 1 argument(s).

这个问题就是在出错原因是命令最后需要一个空格和一个点。

docker build -t image_name .

2、SyntaxError: Non-UTF-8 code starting with ‘\x81’ in file

这是由于文件里包含了中文 / 特殊字符,但文件没声明 UTF-8 编码,Docker 里的 Python 解析时不识别,可以在Dockerfile里面加上声明。

ENV PYTHONIOENCODING=utf-8

3、libGL.so.1: cannot open shared object file: No such file or directory

这个问题是由于缺少cv2的依赖项导致的,我使用的方法是安装下面这个库,就可以运行了,这个测试下来是最快的,因为使用可国内镜像,其他方法不使用镜像的话会很慢。

pip install opencv-python-headless -i https://pypi.tuna.tsinghua.edu.cn/simple

4、ERROR: failed to build: failed to solve: dockerfile parse error on line 9: COPY requires at least two arguments, but only one was provided. Destination could not be determined

这个问题是由于COPY命令写错写错了,正确命令如下。

COPY 源文件/文件夹 容器内目标路径

三、总结

本文详细介绍了在 Windows 系统上使用 Docker 配置深度学习项目的完整流程,并重点区分了开发模式生产模式两种构建方式:

  1. 镜像构建:通过 Dockerfile 文件定义环境。开发模式仅将依赖文件复制到容器,便于本地代码实时修改;生产模式则将整个项目打包进镜像,确保环境与代码的稳定一致。
  2. 构建与运行命令:提供了 docker builddocker run 的具体命令示例,并解释了关键参数(如 -v 挂载卷、-p 端口映射)的作用。
  3. 常见问题与解决方案:针对构建和运行过程中可能遇到的四个典型错误(如构建参数缺失、中文编码错误、OpenCV 依赖缺失、COPY 命令语法错误),给出了清晰的原因分析和有效的解决方法。

通过遵循本文的步骤,你可以成功在 Docker 容器中构建并运行深度学习项目,有效实现环境的隔离、项目的可移植性以及后续的便捷管理。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐