如何将本地桌面的图片文件复制到Docker容器,COPY指令报/data未找到错误如何解决?
问题原因
你遇到的报错和后续潜在问题由三个原因共同导致:
- Docker构建时无法读取本地
data目录:大概率是项目根目录下的.dockerignore文件配置了忽略data目录,或者本地data目录没有放在docker-compose.yml同级的根目录下,导致构建上下文找不到对应路径。 - Dockerfile中拷贝命令路径错误:你执行
COPY ./data /vol后,本地data目录的内容会被放到容器的/vol路径下,容器内当前工作目录是/app,后续RUN指令中执行cp ./data/web/media/default.jpg ...时,容器的/app目录下根本不存在data路径,必然执行失败。 - 挂载卷覆盖构建产物:你在
docker-compose.yml中给app服务配置了static-data:/vol/web的命名卷挂载,容器启动时该卷会完全覆盖/vol/web目录,就算你在构建阶段把默认头像放到该路径下,启动后也会被卷内的内容覆盖,无法访问。
修复步骤
1. 调整目录规则
- 确认本地
data目录放在docker-compose.yml同级的项目根目录下,目录结构为:项目根目录/data/web/media/default.jpg - 打开项目根目录下的
.dockerignore文件,删除所有和data目录相关的忽略规则,确保Docker构建时可以读取到该目录。
2. 修改Dockerfile
调整后的Dockerfile核心修改点如下,其余原有配置保持不变:
# 把原来的 COPY ./data /vol 替换为下面这行,把默认资源放到不会被挂载覆盖的路径 COPY ./data /app/default-resources # 找到RUN指令,删除里面的 cp ./data/web/media/default.jpg /vol/web/media/default.jpg 这一行
修改后完整的Dockerfile参考:
FROM python:3.9-alpine3.13 LABEL maintainer="mRk" ENV PYTHONUNBUFFERED 1 COPY ./requirements.txt /requirements.txt COPY ./app /app COPY ./scripts /scripts COPY ./data /app/default-resources WORKDIR /app EXPOSE 8000 RUN python -m venv /py && \ /py/bin/pip install --upgrade pip && \ apk add --update --no-cache postgresql-client && \ apk add --update --no-cache --virtual .tmp-deps \ build-base postgresql-dev musl-dev linux-headers && \ apk add --virtual build-deps gcc python3-dev musl-dev && \ apk add jpeg-dev zlib-dev libjpeg && \ pip install Pillow && \ apk del build-deps && \ /py/bin/pip install -r /requirements.txt && \ apk del .tmp-deps && \ adduser --disabled-password --no-create-home app && \ mkdir -p /vol/web/static && \ mkdir -p /vol/web/media && \ chown -R app:app /vol && \ chmod -R 755 /vol && \ chmod -R +x /scripts ENV PATH="/scripts:/py/bin:$PATH" USER app CMD ["run.sh"]
3. 修改启动脚本
打开你的run.sh启动脚本,在启动应用服务的命令之前,加入默认头像初始化逻辑:
# 初始化默认头像,避免挂载卷覆盖后文件丢失 if [ ! -f /vol/web/media/default.jpg ]; then mkdir -p /vol/web/media cp /app/default-resources/web/media/default.jpg /vol/web/media/default.jpg chown app:app /vol/web/media/default.jpg chmod 644 /vol/web/media/default.jpg fi
4. 重建镜像启动容器
执行以下命令重新构建镜像并启动服务即可:
docker-compose down -v docker-compose up --build
内容的提问来源于stack exchange,提问作者Mohammad Rahim Khan
相关产品推荐
相关产品推荐

