You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅用Dockerfile运行PHP服务报资源未找到但docker-compose正常的原因

问题根本原因

报错核心来自PHP内置开发服务器的运行逻辑,以及两个部署场景的容器工作目录、文件位置差异:
PHP内置服务器执行php -S启动时,默认将命令执行时所在的工作目录作为Web服务的根目录,只有存放在该目录下的资源才能被正常访问。


纯Dockerfile部署失败的具体原因

你使用的失败场景Dockerfile内容如下:

FROM php:8.1-alpine
COPY . /usr/src/myapp
CMD [ "php", "-S", "0.0.0.0:8000"]

该配置存在关键缺失:

  • 你虽然通过COPY指令将宿主机当前目录下的index.php等文件复制到了容器内的/usr/src/myapp路径,但没有通过WORKDIR指令指定容器的工作目录。php:8.1-alpine官方镜像的默认工作目录是容器根目录/,因此容器启动执行php -S命令时,Web根目录被设置为容器的/路径,该路径下不存在你复制的index.php文件,访问根路径自然返回资源不存在的报错。
  • 可以通过docker run --rm docker_dockerfile_php ls /usr/src/myapp命令验证,复制的文件确实存放在/usr/src/myapp路径下,而非容器根目录。

docker-compose部署正常的具体原因

可正常运行的compose场景满足了两个必要条件:

  1. 该场景使用的Dockerfile中明确配置了WORKDIR /usr/src/myapp,容器启动后执行命令的默认工作目录就是该路径;
  2. compose配置中添加了卷挂载规则./:/usr/src/myapp,将宿主机存放index.php的当前目录直接映射到容器内的/usr/src/myapp路径,确保该路径下存在待访问的PHP文件。

此时php -S命令在/usr/src/myapp路径下执行,Web根目录正好对应存放了index.php的目录,因此访问可以正常响应。


纯Dockerfile部署的修复方案

二选一即可:

  1. 在原Dockerfile中添加工作目录配置,修改后内容如下:
FROM php:8.1-alpine
WORKDIR /usr/src/myapp
COPY . /usr/src/myapp
CMD [ "php", "-S", "0.0.0.0:8000"]

重新构建镜像后启动即可正常访问。
2. 不配置WORKDIR,直接在PHP启动命令中通过-t参数指定Web根目录,修改后CMD指令如下:

CMD [ "php", "-S", "0.0.0.0:8000", "-t", "/usr/src/myapp" ]

这种写法不依赖容器工作目录配置,直接指定服务的文档根路径,也可以解决问题。


内容的提问来源于stack exchange,提问作者Sinedolo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:09:27