修改Dockerfile中WORKDIR导致pip安装requirements.txt失败
问题原因及解决办法
你遇到的问题不是Docker复制机制的问题,而是**/dev目录的特殊性**导致的:
在Linux系统(包括Docker使用的python:slim基础镜像)中,/dev是专门用于存放设备文件的特殊目录,它默认是以tmpfs(临时文件系统)的形式挂载的。tmpfs的内容不会被写入镜像的持久化层,而且在构建镜像的不同步骤之间,tmpfs的内容不会被保留。
这就导致你执行COPY requirements.txt .时,虽然看起来是把文件复制到了/dev目录,但到下一个RUN pip install...步骤时,这个文件已经不存在了——因为tmpfs的内容在步骤切换时被清空了,所以会提示找不到文件。
解决办法
更换WORKDIR到普通目录:
不要使用/dev作为工作目录,换成一个自定义的普通目录,比如/myapp,修改后的Dockerfile如下:FROM python:3.10-slim WORKDIR /myapp COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY ./app /myapp/app CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]如果非要使用/dev下的路径,创建子目录:
如果你有特殊需求必须在/dev下操作,可以在/dev下创建一个子目录作为工作目录,因为子目录不会继承tmpfs的特性,修改后的Dockerfile如下:FROM python:3.10-slim RUN mkdir -p /dev/myapp WORKDIR /dev/myapp COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY ./app /dev/myapp/app CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
内容的提问来源于stack exchange,提问作者Ilya LFBenta Saint
相关产品推荐
相关产品推荐

