我尝试不以root用户身份运行httpd:2.4-alpinedocker image。
预设行为:
> 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可靠地确定服务器的完全限定域名。全局设置“ServerName”指令以禁止显示以下消息AH 00558:httpd:无法使用172.17.0.3可靠地确定服务器的完全限定域名。请全局设置“ServerName”指令以禁止显示此消息[Tue Aug 30 15:57:25.958695 2022] [core:error] [pid 1:tid 140459379268424](13)权限被拒绝:AH 00099:无法创建/usr/local/apache 2/logs/httpd.pid。XXXXXX [2022年8月30日星期二15:57:25.959029] [核心:错误] [pid 1:tid 140459379268424] AH 00100:httpd:无法将pid记录到文件/usr/local/apache 2/logs/httpd.pid
我发现this answer似乎可以解决这个问题,但是因为我在一个Docker环境中,我不知道如何/是否可以应用这个解决方案。
有人知道我如何不以根目录运行此映像吗?
2条答案
按热度按时间mrwjdhj31#
虽然@javierlga的答案是正确的,但您不需要构建新映像来解决这个问题。我们需要做三件事:
1.以
www-data
用户身份运行Apache1.授予
www-data
用户绑定到特权端口的能力,以及1.处理需要将pid文件写入
/usr/local/apache2/logs
。我们可以使用
-u
的参数docker run
来完成(1):我们可以使用
--cap-add
参数来求解(2):我们可以在您在问题中发布的日志中看到问题:
Apache正在尝试将文件写入
/usr/local/apache2/logs
,但www-data
用户没有在此目录中创建文件的权限。解决这个问题的方法有很多,最简单的方法是将pid文件移到
/tmp
,我们可以使用-C
命令行选项将必要的配置指令传递给httpd
:综合起来,我们得到:
或者在
docker-compose.yaml
文件中:它运行无误,不需要维护我们自己的形象。
mccptt672#
这是因为默认情况下,用户
www-data
没有绑定特权端口的能力,事实上,任何其他常规端口都将遇到同样的问题。如您所见,只有父进程以
root
用户身份运行,子进程以www-data
用户身份运行。通过将
setcap 'cap_net_bind_service=+ep'
设置为httpd
二进制文件,您将能够以www-data
用户身份运行它。为了解决这个问题,你需要创建一个新的映像,这是一个Dockerfile示例:
创建新映像后,您将能够以非根用户身份运行该映像。
记录档:
执行身份: