Docker容器卷挂载文件找不到问题求助
问题解决指南
1. 直接修复文件找不到的问题
你当前的核心问题是宿主机文件路径与容器挂载路径不匹配:
- 宿主机的
Memory_Map_File.c存放在/opt/P01_SH/_Library,但你执行的docker run命令仅挂载了当前目录$(pwd)到容器内的/opt/P01_SH/Dockerfiles,容器内的脚本自然找不到不在挂载范围内的文件。 - 调整挂载命令,将包含目标文件的宿主机目录挂载到容器内脚本期望的路径:
如果脚本在容器内期望从/opt/P01_SH/_Library读取文件,执行以下命令:
若脚本内的文件路径是相对docker run -v /opt/P01_SH/_Library:/opt/P01_SH/_Library -it calc:01/opt/P01_SH/Dockerfiles的,则需将宿主机/opt/P01_SH/_Library挂载到容器内对应的相对路径,或直接修改脚本中的文件路径。
2. 明确Bind Mount与Docker Volume的区别
- Bind Mount(绑定挂载):直接将宿主机的具体目录/文件挂载到容器,使用
-v 宿主机路径:/容器路径格式。优点是宿主机与容器文件实时同步,适合开发场景;缺点是依赖宿主机路径结构,换环境易失效。 - Docker Volume(命名/匿名卷):由Docker统一管理的存储目录(默认位于宿主机
/var/lib/docker/volumes/下),使用-v 卷名:/容器路径格式。优点是不依赖宿主机路径,适合生产环境持久化数据;缺点是宿主机无法直接通过常规路径访问,需用docker cp或docker volume inspect操作。
你之前用命名卷无效,是因为命名卷默认是空的,不会自动同步宿主机文件。若要使用命名卷,需手动将宿主机文件复制到卷中:
# 创建命名卷 docker volume create calc-lib # 通过临时容器将宿主机文件复制到卷内 docker run --rm -v /opt/P01_SH/_Library:/source -v calc-lib:/target ubuntu:22.04 cp -r /source/. /target/ # 使用命名卷启动容器 docker run -v calc-lib:/opt/P01_SH/_Library -it calc:01
3. 额外验证步骤
- 确认
Docker_Entry_Point.sh中的文件路径是容器内的路径,而非宿主机路径。 - 挂载后可先进入容器验证文件是否存在:
docker run -v /opt/P01_SH/_Library:/opt/P01_SH/_Library -it calc:01 bash # 在容器内执行以下命令检查文件 ls /opt/P01_SH/_Library - 检查挂载目录权限:确保容器内运行的用户拥有挂载目录的访问权限,必要时用
--user指定用户,或调整宿主机目录权限。
内容的提问来源于stack exchange,提问作者RTC222
相关产品推荐
相关产品推荐

