Docker容器内文件夹缺失问题求助(附Docker-Compose及Dockerfile配置)
解决Docker容器内文件夹缺失问题
先把你给出的配置贴出来方便排查:
你的Docker-Compose配置
version: '3.1' services: db: image: mysql restart: always environment: - MYSQL_DATABASE=mgsv - MYSQL_USER=mgsv_user - MYSQL_PASSWORD=mgsvpass - MYSQL_ROOT_PASSWORD=mysql123 volumes: - ./mysql:/docker-entrypoint-initdb.d www: build: ./mGSV restart: always ports: - 8080:8080
你的Dockerfile片段
FROM php:5-apache RUN apt-get update && apt-get install -y --no-install-r...
下面是一步步排查和解决的思路,你可以跟着来:
排查与解决步骤
1. 先确认本地文件夹结构对不对
先看看你的项目根目录下,./mysql和./mGSV这两个文件夹是不是真的存在:
- 跑个
ls -l看看根目录的文件结构,确保这俩文件夹都在,而且里面有内容(比如./mysql里得有初始化用的SQL脚本,./mGSV里得有完整的Dockerfile和你的项目代码)。 - 如果
./mysql没了,手动建一个:mkdir mysql,把需要的SQL放进去;要是./mGSV路径不对,得确认你的项目代码是不是放在这个目录下。
2. 补全你的Dockerfile,关键步骤不能少
你的Dockerfile命令被截断了,apt-get install -y --no-install-r...后面的内容没写完,这可能导致依赖装不全,甚至影响文件夹生成。比如你的PHP项目肯定需要MySQL扩展吧?得在Dockerfile里加上安装和启用的命令:
FROM php:5-apache RUN apt-get update && apt-get install -y --no-install-recommends \ mysql-client \ && docker-php-ext-install mysqli pdo_mysql \ && apt-get clean && rm -rf /var/lib/apt/lists/*
最关键的一点:如果你的项目代码要复制到容器里,Dockerfile里必须有COPY命令! 比如把本地./mGSV里的代码复制到Apache的默认目录:
# 把当前目录(Dockerfile所在的./mGSV)的代码复制到容器的/var/www/html COPY . /var/www/html/
要是没这个命令,容器里的/var/www/html就是空的,自然会出现文件夹缺失的问题。
3. 检查卷挂载是否生效
对于db服务的./mysql:/docker-entrypoint-initdb.d挂载:
- 先确认
./mysql里的文件权限没问题,跑个chmod -R 755 mysql,确保容器能读里面的内容。 - 进入db容器看看挂载有没有成功:
docker exec -it <你的db容器名> ls /docker-entrypoint-initdb.d,要是看不到文件,说明本地路径写错了,得检查是不是相对于docker-compose.yml所在的目录。
对于www服务,要是你没靠Dockerfile的COPY传代码,而是用了卷挂载,得确认挂载路径对不对,比如:
www: build: ./mGSV restart: always ports: - 8080:8080 volumes: - ./mGSV:/var/www/html # 这样本地代码会同步到容器里
4. 删旧镜像容器,重新构建启动
有时候旧的镜像可能留了缓存,导致问题一直存在,先清掉重新来:
# 停止并删除容器 docker-compose down # 删除旧的www镜像(可以用docker images先查镜像名) docker rmi <你的www服务镜像名> # 重新构建并启动 docker-compose up --build
5. 直接进容器看真实情况
要是还是不行,直接进www容器里查看文件结构,一目了然:
docker exec -it <你的www容器名> bash # 然后看目录 ls -l /var/www/html
这样就能知道到底是复制失败了,还是挂载出问题,再针对性解决。
内容的提问来源于stack exchange,提问作者user3523406
相关产品推荐
相关产品推荐

