首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何以root用户的身份运行httpd:2.4-高寒坞映像

如何以root用户的身份运行httpd:2.4-高寒坞映像
EN

Stack Overflow用户
提问于 2022-08-30 16:04:48
回答 2查看 286关注 0票数 0

我尝试以根用户的身份运行httpd:2.4-alpine 码头形象

默认行为:

代码语言:javascript
运行
复制
> 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

代码语言:javascript
运行
复制
...
RUN set -x \
    && adduser -u 82 -D -S -G www-data www-data
# 82 is the standard uid/gid for "www-data" in Alpine
...

让我们尝试使用这个用户来运行这个映像:

代码语言:javascript
运行
复制
> 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

我已经找到了修复这个问题的这个答案,但是由于我是在一个对接环境中,所以我不知道如何/是否可以应用这个解决方案。

有人知道我如何运行这个图像,而不是作为一个根?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-30 18:21:43

虽然@javierlga的答案是正确的,但是您不需要构建一个新的映像来解决这个问题。我们需要做三件事:

  1. www-data用户身份运行Apache
  2. 授予www-data用户绑定到特权端口的能力,以及
  3. 处理将pid文件写入/usr/local/apache2/logs的需要。

我们可以使用-u参数来实现(1)到docker run

代码语言:javascript
运行
复制
docker run -u www-data ...

我们可以用--cap-add参数求解(2)到docker run

代码语言:javascript
运行
复制
docker run -u www-data --cap-add net_bind_service ...

这就剩下(3)了。我们可以从您在问题中发布的日志中看到问题所在:

代码语言:javascript
运行
复制
Permission denied: AH00099: could not create /usr/local/apache2/logs/httpd.pid.XXXXXX

Apache正在尝试将文件写入/usr/local/apache2/logs,但www-data用户没有权限在此目录中创建文件。

解决这个问题有很多种方法。最简单的方法可能是将pidfile移动到/tmp,我们可以通过使用-C命令行选项将必要的配置指令传递给httpd来实现:

代码语言:javascript
运行
复制
docker run ... docker.io/httpd:2.4.54-alpine \
  httpd-foreground -C 'PidFile /tmp/httpd.pid'

把这一切结合起来,我们就会得到:

代码语言:javascript
运行
复制
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文件中:

代码语言:javascript
运行
复制
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

这是没有错误的,不需要维护我们自己的形象。

票数 2
EN

Stack Overflow用户

发布于 2022-08-30 16:40:23

原因是默认情况下,用户www-data缺乏绑定特权端口的能力,事实上,任何其他常规端口都会有相同的问题。

如您所见,只有父进程作为root用户运行,子进程作为www-data用户运行。

代码语言:javascript
运行
复制
/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示例:

代码语言:javascript
运行
复制
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

一旦创建了新映像,就可以以非根用户的身份运行映像。

日志:

代码语言:javascript
运行
复制
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'

以下列方式运行:

代码语言:javascript
运行
复制
/usr/local/apache2 $ whoami
www-data
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73545409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档