使用Dockerfile的COPY --from命令无法复制stain/jena-fuseki:4.0.0的/fuseki目录
无法从stain/jena-fuseki:4.0.0镜像通过COPY --from复制/fuseki目录的问题
问题现象
执行以下Dockerfile构建镜像时:
FROM python:3.8.15-slim COPY --from=stain/jena-fuseki:4.0.0 /fuseki /fuseki
会报错:
COPY failed: stat fuseki: file does not exist
但通过docker run -it stain/jena-fuseki:4.0.0进入容器后,能确认/fuseki目录存在;且复制其他目录(如/jena-fuseki)的Dockerfile可正常构建:
FROM python:3.8.15-slim COPY --from=stain/jena-fuseki:4.0.0 /jena-fuseki /jena-fuseki
原因分析
stain/jena-fuseki:4.0.0镜像的/fuseki目录被声明为Docker VOLUME(数据卷)。Docker的VOLUME机制有以下特性:
- VOLUME声明的目录,其内容不会被包含在镜像的持久化层中,仅在容器运行时由Docker动态创建并挂载卷。
- 构建阶段的
COPY --from只能读取镜像静态层中的内容,无法访问VOLUME目录的内容——即便容器运行时该目录存在,镜像本身并没有存储其实际内容。
可通过docker inspect stain/jena-fuseki:4.0.0验证,输出的Config.Volumes字段中会显示/fuseki的记录。
解决方案
方案1:复制镜像构建时的原始目录
jena-fuseki镜像中/fuseki的内容实际来源于/jena-fuseki目录,直接复制该目录到目标镜像的/fuseki即可:
FROM python:3.8.15-slim COPY --from=stain/jena-fuseki:4.0.0 /jena-fuseki /fuseki
方案2:自行构建无VOLUME声明的jena-fuseki镜像
- 拉取stain/jena-fuseki的Dockerfile源码,删除其中的
VOLUME /fuseki行。 - 用修改后的Dockerfile构建自定义镜像:
docker build -t my-jena-fuseki:4.0.0 .
- 在目标Dockerfile中使用自定义镜像作为源:
FROM python:3.8.15-slim COPY --from=my-jena-fuseki:4.0.0 /fuseki /fuseki
方案3:运行时挂载卷共享内容
如果不需要在构建阶段将/fuseki内容打包到镜像,可在运行Python容器时通过挂载卷共享jena-fuseki的内容:
# 启动jena-fuseki容器 docker run -d --name fuseki stain/jena-fuseki:4.0.0 # 运行Python容器并挂载fuseki的卷 docker run -it --volumes-from fuseki python:3.8.15-slim
内容的提问来源于stack exchange,提问作者Greenfish
相关产品推荐
相关产品推荐

