如何以非root用户运行httpd:2.4-alpine Docker镜像
问题背景
默认情况下启动httpd:2.4-alpine镜像,容器会以root用户运行:
> docker run -p 80:80 -d --rm --name httpd httpd:2.4-alpine 3c271ae8abfc3f54c0e63d62a2ce26fcbeeef29064da66f4b3f6bd00480ad4fb > docker exec httpd whoami root
该镜像的Dockerfile中已创建UID为82的www-data用户,但直接通过-u www-data参数启动时会报错:
> docker stop httpd # 清理之前的实例 > docker run -p 80:80 --rm --name httpd -u www-data httpd:2.4-alpine
错误信息如下:
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message [Tue Aug 30 15:57:25.958695 2022] [core:error] [pid 1:tid 140459379268424] (13)Permission denied: AH00099: could not create /usr/local/apache2/logs/httpd.pid.XXXXXX [Tue Aug 30 15:57:25.959029 2022] [core:error] [pid 1:tid 140459379268424] AH00100: httpd: could not log pid to file /usr/local/apache2/logs/httpd.pid
报错核心原因是www-data用户没有权限写入Apache的日志目录、运行目录。以下是两种可行的解决方法:
方法一:构建自定义镜像(永久修改权限)
创建一个自定义Dockerfile,调整目录权限并指定运行用户:
FROM httpd:2.4-alpine # 给www-data用户赋予Apache关键目录的读写权限 RUN chown -R www-data:www-data /usr/local/apache2/logs/ \ && chown -R www-data:www-data /usr/local/apache2/run/ \ && chown -R www-data:www-data /usr/local/apache2/htdocs/ # 指定容器启动时使用www-data用户 USER www-data
执行以下命令构建并运行自定义镜像:
docker build -t custom-httpd . docker run -p 80:80 --rm --name httpd custom-httpd
方法二:启动时挂载本地目录并调整权限(无需构建镜像)
通过本地目录挂载,先临时调整权限再运行容器:
- 创建本地目录用于挂载:
mkdir -p ./apache-logs ./apache-run ./apache-htdocs
- 启动临时容器,修改挂载目录的权限为
www-data所有:
docker run --rm -v $(pwd)/apache-logs:/usr/local/apache2/logs \ -v $(pwd)/apache-run:/usr/local/apache2/run \ -v $(pwd)/apache-htdocs:/usr/local/apache2/htdocs \ httpd:2.4-alpine sh -c "chown -R www-data:www-data /usr/local/apache2/logs/ /usr/local/apache2/run/ /usr/local/apache2/htdocs/"
- 挂载本地目录,以
www-data用户启动容器:
docker run -p 80:80 --rm --name httpd -u www-data \ -v $(pwd)/apache-logs:/usr/local/apache2/logs \ -v $(pwd)/apache-run:/usr/local/apache2/run \ -v $(pwd)/apache-htdocs:/usr/local/apache2/htdocs \ httpd:2.4-alpine
消除ServerName警告
上述操作后可能还会出现ServerName的警告,可通过自定义配置文件解决:
- 复制默认配置文件到本地:
docker run --rm httpd:2.4-alpine cat /usr/local/apache2/conf/httpd.conf > ./httpd.conf
- 编辑本地
httpd.conf,添加一行:
ServerName localhost:80
- 启动容器时挂载自定义配置文件:
docker run -p 80:80 --rm --name httpd -u www-data \ -v $(pwd)/httpd.conf:/usr/local/apache2/conf/httpd.conf \ -v $(pwd)/apache-logs:/usr/local/apache2/logs \ -v $(pwd)/apache-run:/usr/local/apache2/run \ -v $(pwd)/apache-htdocs:/usr/local/apache2/htdocs \ httpd:2.4-alpine
内容的提问来源于stack exchange,提问作者Will

