如何向Docker中运行的Apache Web服务器上传HTML文件
问题原因
默认官方httpd Docker镜像未开启WebDAV服务,不支持HTTP PUT方法上传文件,直接用curl发PUT请求会返回405 Method Not Allowed报错。你之前写的curl命令存在两处语法错误:
- HTML文件的正确MIME类型是
text/html,不是application/html - curl上传文件的参数写法错误,直接加
@index.html不会被识别为文件上传参数,部分场景下curl会自动回退为GET请求,因此会返回原有首页内容。
另外Apache默认运行身份是容器内的daemon用户,不存在root账号的HTTP认证逻辑,加-u root参数没有任何作用。
编程化实现方案(无GUI操作)
方案1:docker cp直接拷贝(最推荐,零配置)
不需要修改Apache任何配置,直接通过Docker命令把本地文件拷贝进容器的站点目录即可:
- 先执行
docker ps获取运行中httpd容器的ID或名称 - 执行拷贝命令,将本地index.html传入容器的默认站点根目录:
docker cp ./index.html <你的容器ID或名称>:/usr/local/apache2/htdocs/index.html
- 如果访问时出现403权限错误,执行以下命令修正文件属主:
docker exec <你的容器ID或名称> chown daemon:daemon /usr/local/apache2/htdocs/index.html
执行完成后直接访问http://localhost:81就能看到新首页。
方案2:开启WebDAV支持,用curl通过HTTP上传
如果需要通过HTTP接口的方式上传文件,先给容器内的Apache开启WebDAV模块:
- 进入运行中的容器:
docker exec -it <你的容器ID或名称> /bin/bash
- 启用WebDAV依赖模块:
a2enmod dav a2enmod dav_fs
- 编辑配置文件
/usr/local/apache2/conf/httpd.conf,找到站点目录对应的<Directory "/usr/local/apache2/htdocs">配置块,在块内新增一行Dav On,保存退出。 - 重启容器让配置生效:
docker restart <你的容器ID或名称>
- 使用正确的curl命令上传文件:
curl -X PUT -H "Content-Type: text/html" -T index.html http://localhost:81/index.html
方案3:本地目录挂载(开发测试场景最方便)
如果需要频繁修改首页内容,启动容器时直接把本地存放网页文件的目录挂载到容器的站点目录,后续本地修改文件会自动同步到容器,不需要重复上传:
docker run -d -p 81:80 -v /本地存放网页文件的绝对路径:/usr/local/apache2/htdocs/ httpd
内容的提问来源于stack exchange,提问作者wgb22
相关产品推荐
相关产品推荐

