Node 无法访问 WordPress Docker 容器 /var/www/html 目录该如何解决
问题根因拆解
- 跨容器文件完全隔离:
wordpress_frontend_buildNode构建服务和wordpressWeb服务运行在独立的容器命名空间中,两个容器哪怕配置了完全相同的路径字符串(比如/var/www/html),也是各自独立的存储空间,不存在任何自动文件同步机制。你在Node容器内构建生成的所有文件,都只存在于Node容器自己的存储层,哪怕构建流程完全没有报错,这些文件也不会自动同步到WordPress容器,更不会被WordPress容器感知到,这就是你在WordPress容器内查不到public目录的核心原因。 - 配置认知误区:Node构建容器内设置的
WORKDIR /var/www/html,只是在Node镜像内部创建了一个空的独立目录,既不属于WordPress容器的路径空间,也不会自动和WordPress容器的同路径目录打通。这种路径名的相似性不代表存储层的共享。 - 原配置语法错误:提供的
docker-compose.yml存在结构缩进错误,所有服务配置没有嵌套在顶层的services键下,会导致Compose解析异常。 - 操作边界限制:Dockerfile中的
COPY命令仅能操作镜像构建上下文(即../wordpress-custom目录)内的本地文件,无法跨容器访问WordPress服务运行时的内部文件系统,不存在“访问另一个容器目录”的能力。
可落地的修复方案
核心逻辑:复用已配置的宿主机挂载卷,让Node构建服务直接读写和WordPress服务共享的同一份宿主机文件,从根源打通文件链路,不需要跨容器做文件访问。
第一步:修正docker-compose.yml结构
- 补全顶层
services节点结构,修正所有服务的嵌套缩进。 - 给Node构建服务挂载和WordPress服务完全相同的宿主机主题目录,让构建流程直接读写宿主机上的主题文件。
修正后的参考配置:
version: "3.8" services: mysql_wordpress: command: --default-authentication-plugin=mysql_native_password --sql_mode="NO_ENGINE_SUBSTITUTION" image: mysql:5.7.22 ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: "pass" MYSQL_DATABASE: "wordpress_db" wordpress: depends_on: - mysql_wordpress - wordpress_frontend_build image: wordpress:latest ports: - "3002:80" links: - mysql_wordpress:mysql env_file: - "../wordpress-custom/.env" volumes: - ../wordpress-custom/plugins:/var/www/html/wp-content/plugins/ # 宿主机主题目录直接挂载到WordPress容器对应路径 - ../wordpress-custom/my-custom-theme:/var/www/html/wp-content/themes/my-custom-theme wordpress_frontend_build: build: "../wordpress-custom" volumes: # 给构建服务挂载同一个宿主机主题目录,和WordPress共用文件 - ../wordpress-custom/my-custom-theme:/app/my-custom-theme
第二步:修正Dockerfile的无效路径配置
去掉无意义的WORKDIR /var/www/html 伪路径配置,改用Node容器内正常的工作目录,避免和WordPress容器的路径产生认知混淆:
修正后的参考配置:
FROM node:14 AS builder # 使用正常的构建工作目录,不再蹭WordPress容器的路径名 WORKDIR /app COPY ["./my-custom-theme/src", "/app/my-custom-theme/src" ] COPY [ "package*.json", "/app/" ] COPY [ "webpack.config.js", "/app/" ] RUN npm install RUN npm run build && rm webpack.config.js RUN npm prune --production
第三步:调整构建输出路径匹配
修改webpack.config.js 中的输出配置,把构建生成的public 目录直接输出到挂载卷对应的主题目录下,比如配置输出路径为/app/my-custom-theme/public——因为这个路径已经通过卷映射到宿主机的主题目录,WordPress服务已经挂载了同一个宿主机目录,构建完成后文件会自动同步到WordPress可读取的范围内。
常见避坑提示
- 不要尝试在Node容器内通过路径名匹配WordPress容器的文件系统,所有跨容器的文件同步,都需要通过宿主机卷的中转实现。
- 构建流程完成后如果不需要保留Node容器的运行进程,可以给构建服务配置一次性执行的命令,构建完成后自动退出,减少不必要的资源占用。
- 排查文件是否存在时,优先查看宿主机上的对应挂载目录,不要只在容器内部做检查——如果构建产物没有落到宿主机目录,哪怕容器内部能查到,WordPress容器也读不到。
内容的提问来源于stack exchange,提问作者sarahparker_1989
相关产品推荐
相关产品推荐

