我尝试以根用户的身份运行httpd:2.4-alpine 码头形象。
默认行为:
> docker run -p 80:80 -d --rm --name httpd httpd:2.4-alpine
3c271ae8abfc3f54c0e63d62a2ce26fcbeeef29064da66f4b3f6bd00480ad4fb
> docker exec httpd --name httpd whoami
root
在查看此图像的Dockerfile定义之后,可以看到使用id 82
创建了一个www-data
:
...
RUN set -x \
&& adduser -u 82 -D -S -G www-data www-data
# 82 is the standard uid/gid for "www-data" in Alpine
...
让我们尝试使用这个用户来运行这个映像:
> docker stop httpd # cleaning previous instance
> docker run -p 80:80 --rm --name httpd -u www-data httpd:2.4-alpine
此错误失败:
AH00558: httpd:无法使用172.17.0.3可靠地确定服务器的完全限定域名。使用172.17.0.3全局设置“ServerName”指令以抑制此消息-- AH00558: httpd: AH00558无法可靠地确定服务器的完全限定域名。全局设置“ServerName”指令以抑制此消息Tue Aug 15:57:25.958695 2022 pid 1:tid 140459379268424权限被拒绝: AH00099:未能创建/usr/local/apache2/AH00099/httpd.pid.XXXXXXXX Tue 30 15:57:25.959029 2022 pid 1:tid 140459379268424 AH00100: httpd:未能将pid记录到文件/usr/local/apache2/ log /httpd.pid
我已经找到了修复这个问题的这个答案,但是由于我是在一个对接环境中,所以我不知道如何/是否可以应用这个解决方案。
有人知道我如何运行这个图像,而不是作为一个根?
发布于 2022-08-30 18:21:43
虽然@javierlga的答案是正确的,但是您不需要构建一个新的映像来解决这个问题。我们需要做三件事:
www-data
用户身份运行Apachewww-data
用户绑定到特权端口的能力,以及/usr/local/apache2/logs
的需要。我们可以使用-u
参数来实现(1)到docker run
docker run -u www-data ...
我们可以用--cap-add
参数求解(2)到docker run
docker run -u www-data --cap-add net_bind_service ...
这就剩下(3)了。我们可以从您在问题中发布的日志中看到问题所在:
Permission denied: AH00099: could not create /usr/local/apache2/logs/httpd.pid.XXXXXX
Apache正在尝试将文件写入/usr/local/apache2/logs
,但www-data
用户没有权限在此目录中创建文件。
解决这个问题有很多种方法。最简单的方法可能是将pidfile移动到/tmp
,我们可以通过使用-C
命令行选项将必要的配置指令传递给httpd
来实现:
docker run ... docker.io/httpd:2.4.54-alpine \
httpd-foreground -C 'PidFile /tmp/httpd.pid'
把这一切结合起来,我们就会得到:
docker run -u www-data \
--cap-add net_bind_service -p 8080:80 \
docker.io/httpd:2.4.54-alpine \
httpd-foreground -C 'PidFile /tmp/httpd.pid'
或者在docker-compose.yaml
文件中:
version: "3"
services:
httpd:
image: docker.io/httpd:2.4.54-alpine
command: [httpd-foreground, -C, "PidFile /tmp/httpd.pid"]
user: www-data
ports:
- "8080:80"
cap_add:
- net_bind_service
这是没有错误的,不需要维护我们自己的形象。
发布于 2022-08-30 16:40:23
原因是默认情况下,用户www-data
缺乏绑定特权端口的能力,事实上,任何其他常规端口都会有相同的问题。
如您所见,只有父进程作为root
用户运行,子进程作为www-data
用户运行。
/usr/local/apache2 # ps aux
PID USER TIME COMMAND
1 root 0:00 httpd -DFOREGROUND
8 www-data 0:00 httpd -DFOREGROUND
9 www-data 0:00 httpd -DFOREGROUND
10 www-data 0:00 httpd -DFOREGROUND
92 root 0:00 sh
98 root 0:00 ps aux
通过将setcap 'cap_net_bind_service=+ep'
设置为httpd
二进制文件,您将能够以www-data
用户的身份运行它。
为了解决这个问题,您需要创建一个新的映像,这是一个Dockerfile示例:
FROM httpd:2.4-alpine
RUN apk add libcap && chown -hR www-data:www-data /usr/local/apache2/ && \
setcap 'cap_net_bind_service=+ep' /usr/local/apache2/bin/httpd
USER www-data
一旦创建了新映像,就可以以非根用户的身份运行映像。
日志:
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. 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.2. Set the 'ServerName' directive globally to suppress this message
[Tue Aug 30 16:51:43.660323 2022] [mpm_event:notice] [pid 1:tid 281473523657800] AH00489: Apache/2.4.54 (Unix) configured -- resuming normal operations
[Tue Aug 30 16:51:43.660358 2022] [core:notice] [pid 1:tid 281473523657800] AH00094: Command line: 'httpd -D FOREGROUND'
以下列方式运行:
/usr/local/apache2 $ whoami
www-data
https://stackoverflow.com/questions/73545409
复制相似问题