仅用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场景满足了两个必要条件:
- 该场景使用的Dockerfile中明确配置了
WORKDIR /usr/src/myapp,容器启动后执行命令的默认工作目录就是该路径; - compose配置中添加了卷挂载规则
./:/usr/src/myapp,将宿主机存放index.php的当前目录直接映射到容器内的/usr/src/myapp路径,确保该路径下存在待访问的PHP文件。
此时php -S命令在/usr/src/myapp路径下执行,Web根目录正好对应存放了index.php的目录,因此访问可以正常响应。
纯Dockerfile部署的修复方案
二选一即可:
- 在原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
相关产品推荐
相关产品推荐

