Docker构建时无法访问挂载卷,但运行时可正常访问的问题求助
问题分析与解决方案
核心原因
你遇到的问题本质是对Docker bind挂载的逻辑理解有误:当你用本地目录挂载到容器内的目标目录时,Docker会用本地目录的内容覆盖容器内的目标目录,而不是把容器内的文件同步到本地。
你的本地./site是空目录,挂载到容器的/var/www/html后,容器里原本存在的CodeIgniter项目文件被空目录覆盖了,所以本地看不到文件;而你用docker exec写入文件时,是直接写入到挂载的本地目录,所以能同步,这和初始文件丢失的问题不冲突。
解决方案
方法一:先复制容器内的初始文件到本地(最直接)
- 临时修改
docker-compose.yml,注释掉./site:/var/www/html/这一行挂载配置 - 启动容器:
docker-compose up -d - 找到
sharif-judge容器的名称或ID:docker ps - 复制容器内的
/var/www/html目录到本地./site:docker cp <容器名称/ID>:/var/www/html ./site - 停止容器:
docker-compose down - 恢复
docker-compose.yml中的挂载配置,重新启动容器即可
方法二:修改镜像启动逻辑(适合自定义镜像场景)
如果需要每次启动容器时自动同步初始文件,可以修改镜像的entrypoint脚本,添加逻辑:检查/var/www/html是否为空,若为空则从镜像内的备份目录复制初始文件过去。比如:
- 在Dockerfile中把初始的
/var/www/html内容复制到一个备份目录,比如/var/www/html-backup - 编写entrypoint脚本,添加:
if [ -z "$(ls -A /var/www/html)" ]; then cp -r /var/www/html-backup/* /var/www/html/ fi - 重新构建镜像后使用
补充说明
你后来改用显式的type: bind挂载格式,本质和之前的短格式挂载没有区别,所以问题不会解决;修改目录所有权也不是核心问题,因为你已经能通过exec写入文件,说明权限是正常的。
内容的提问来源于stack exchange,提问作者Kon
相关产品推荐
相关产品推荐

