如何向Docker镜像复制添加文件 构建时找不到测试图片文件
问题原因
你当前编写的Dockerfile仅复制了image_converter.py、test_image_converter.py两个Python脚本文件,没有将测试依赖的图片资源复制到镜像内的工作目录,执行单元测试时脚本在镜像文件系统中找不到目标图片,就会触发文件不存在的报错。
你的项目目录结构如下:
修复方法
- 补充COPY规则同步图片资源
你需要在Dockerfile中新增指令,把测试用到的图片也复制到镜像的/usr/app/src工作目录下:- 如果测试图片和两个py文件、Dockerfile在同一级目录,直接按格式复制即可,比如用到jpg、png格式的测试图,就添加
COPY *.jpg ./、COPY *.png ./规则 - 如果图片统一存放在子文件夹中(比如命名为
test_imgs、assets),就用COPY 文件夹名/ ./文件夹名/的格式把整个文件夹复制进去,保持和本地一致的目录结构,避免脚本里写的相对路径失效 - 不想单独写每条复制规则的话,也可以直接用
COPY . ./把当前构建目录下的所有文件复制进镜像,但建议同目录下新建.dockerignore文件,过滤掉本地虚拟环境、.git目录、本地缓存文件等不需要打包的内容,避免镜像体积冗余。
- 如果测试图片和两个py文件、Dockerfile在同一级目录,直接按格式复制即可,比如用到jpg、png格式的测试图,就添加
- 检查脚本内的文件路径
不要在代码里写本地机器的绝对路径,比如Windows的C:/code/project/test.jpg、Mac/Linux的/Users/xxx/project/test.jpg这类路径在镜像中不存在,统一使用相对于工作目录的相对路径写文件读取逻辑。
修改后的Dockerfile参考如下:
FROM ubuntu:latest RUN apt update RUN apt install python3 -y RUN apt-get -y install python3-pip RUN pip install pillow RUN pip install wand RUN DEBIAN_FRONTEND="noninteractive" apt-get install libmagickwand-dev --no-install-recommends -y WORKDIR /usr/app/src COPY image_converter.py ./ COPY test_image_converter.py ./ # 复制测试用图片,按需调整规则 COPY *.jpg ./ COPY *.png ./ # 存在图片子目录时放开对应注释 # COPY test_imgs/ ./test_imgs/ RUN python3 -m unittest test_image_converter.py
注意执行
docker build命令时,要在Dockerfile所在的项目根目录下运行,否则COPY指令无法匹配到本地的源文件。
内容的提问来源于stack exchange,提问作者Mike D Hovhannisyan
相关产品推荐
相关产品推荐

