如何以非 root 用户身份运行 Apache?

2024-01-31

我正在从以下 Dockerfile 和以下命令构建图像docker build --rm -f "Dockerfile" -t non_root_image_plz_work .:

Docker文件

FROM node:14.7.0-buster-slim AS apache_for_selenium

# Create non-root group and user
RUN addgroup --system shared-folder \
&& adduser --system --home /var/cache/shared-folder --group shared-folder --uid 1001

# Make Port accessable 
EXPOSE 80/tcp

# Set Node env.Name
ENV NODE_ENV=dev 

RUN apt-get -qq update && apt-get -qq install -y --no-install-recommends nano git openssl bash musl curl apache2 apache2-utils systemd && \
    systemctl enable apache2 && npm config set registry http://localhost:5000/repository/repo && \
    npm i -g pm2 serve && mkdir /usr/share/shared-folder

RUN ln -sf /dev/stdout /var/log/apache2/access.log && \
    ln -sf /dev/stderr /var/log/apache2/error.log    

WORKDIR /usr/share/shared-folder 

COPY . /usr/share/shared-folder/

RUN npm install && npm cache clean --force && npm cache verify && \
    rm /var/www/html/index.html && \
    ln -s /usr/share/shared-folder/mochawesome-report /var/www/html/mochawesome-report && \
    chown www-data -R /var/www/html/mochawesome-report && chgrp www-data -R /var/www/html/mochawesome-report 

VOLUME /usr/share/shared-folder/mochawesome-report

USER 1001

CMD [ "sh", "-c", "service apache2 start ; pm2-runtime process.yml --no-daemon" ]

当我尝试使用运行图像时docker run non_root_image_plz_work,我收到以下错误:

运行后出错docker run命令:启动 Apache httpd Web 服务器:apache2 失败! apache2 配置测试失败。 ... (警告)。 配置测试的输出是: mkdir:无法创建目录“/var/run/apache2”:权限被拒绝 chown:更改“/var/lock/apache2.3FGoa8Y71E”的所有权:不允许操作

这似乎是一个权限问题,就好像我没有以非根用户身份正确运行容器一样。关于如何让容器以非 root 用户身份正常运行有什么建议吗?

Note:我在 Dockerfile 中使用了虚拟注册表,因为我不想显示实际的注册表,谢谢


在 Docker 中,所有文件夹都属于root。在不知道你的目录结构的情况下,我猜你的问题是,你的用户1001(或运行的安装程序1001的许可)尝试访问(可能)拥有的目录root.

您可以尝试:

  1. 更改文件夹的权限。

    如果您知道访问了哪些文件夹并希望防止进一步的权限问题,可以使用此功能。

    chmod -R 777 /path/to/folder
    
  2. 授予您的用户适当的权限。

    这里有一个很快演练。如果它不能解决您的问题,请发表评论,我会尝试更新以获得更具体的答案。

    一个小例子(取自here https://superuser.com/questions/1296533/sudo-inside-docker-on-fedora-ask-for-password-on-host-it-doesnt-ask-password)。 您可以设置您的非 root 用户foo无密码访问:

    RUN \
        groupadd -g 1001 foo && useradd -u 1001 -g foo -G sudo -m -s /bin/bash 1001 
    && \
        sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
        sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
        sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
        echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers;  su - foo -c id
    

    Hint:您可能需要安装sudo

    apt-get install sudo
    

    现在,尝试运行入口点(或你的命令)与sudo.


编辑: 我已经更新了答案以匹配您的 Docker 文件。看看它。用户非 root 被分配了 uuid1001并添加到/etc/sudoers。此外,您的命令现在使用 sudo 运行,这应该可以防止权限问题。

FROM node:14.7.0-buster-slim AS apache_for_selenium

# Create non-root group and user
RUN addgroup --system shared-folder \
    && adduser --system --home /var/cache/shared-folder --ingroup shared-folder --uid 1001 nonroot

# Make Port accessable 
EXPOSE 80/tcp

# Set Node env.Name
ENV NODE_ENV=dev 

RUN apt-get -qq update && apt-get -qq install -y --no-install-recommends \
    sudo nano git openssl bash musl curl apache2 apache2-utils systemd \
    && systemctl enable apache2 
    #\
    # && #npm config set registry http://localhost:5000/repository/repo && \
    #npm i -g pm2 serve && mkdir /usr/share/shared-folder

RUN ln -sf /dev/stdout /var/log/apache2/access.log && \
    ln -sf /dev/stderr /var/log/apache2/error.log    

WORKDIR /usr/share/shared-folder 

COPY . /usr/share/shared-folder/

RUN npm install && npm cache clean --force && npm cache verify && \
    rm /var/www/html/index.html && \
    ln -s /usr/share/shared-folder/mochawesome-report /var/www/html/mochawesome-report && \
    chown www-data -R /var/www/html/mochawesome-report && chgrp www-data -R /var/www/html/mochawesome-report 

VOLUME /usr/share/shared-folder/mochawesome-report

RUN \
    sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
    echo "nonroot ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

USER nonroot
CMD [ "sudo sh", "-c", "service apache2 start ; pm2-runtime process.yml --no-daemon" ]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以非 root 用户身份运行 Apache? 的相关文章

  • VS2017 构建失败 - DOCKER_REGISTRY

    我正在开始使用 Docker 并熟悉 NET Core 和 Visual Studio 2017 我创建了一个名为 WebApplicationCore21 的新 Web 应用程序 Razor Pages 并启用了 Docker 支持 并立
  • 多个 Docker 容器和 Celery

    我们现在的项目结构如下 处理来自客户端的传入请求的 Web 服务器 向用户提供一些建议的分析模块 我们决定保持这些模块完全独立 并将它们移动到不同的 docker 容器中 当用户的查询到达网络服务器时 它会向分析模块发送另一个查询以获取推荐
  • 无法连接到 WSL2 内 docker 内的 mongo

    我的设置有什么问题吗 这是我的docker compose yml我从sudo docker compose up d 最终结果是这样的 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAM
  • 从 Docker 容器获取控制台输出

    我构建了一个安装了 Python 的映像以及一个 Python 应用程序 我的 Python 应用程序是你好世界 应用程序 只需打印 Hello World 屏幕上 Dockerfile FROM python 2 onbuild CMD
  • oauth2client.client.AccessTokenRefreshError: invalid_grant 仅在 Docker 中

    我有相同的代码 具有相同的 p12 文件 检查了 md5 和 相同的 account email 和相同的范围 可以在多台计算机上工作 但不能在任何工作计算机上的 Docker 容器中工作 我的代码片段如下 with open self p
  • 使用SQL Server Management Studio远程连接docker容器

    Context 我正在尝试构建一个开发 SQL Server 我可以在其上继续学习 SQL 并使用 Microsoft SQL Server Management Studio SSMS 在 Windows PC 上访问 因此 我将 Adv
  • Docker Engine可以并行启动容器吗

    如果我有并行发出 docker run 命令的脚本 则 docker 引擎似乎会串行处理这些命令 由于使用 docker run 运行最小的容器映像需要大约 100 毫秒才能启动 这是否意味着并行发出命令来运行 1000 个容器将花费 do
  • 如何同时将单个卷挂载到多个/var/lib/docker?

    可以将单个 docker 卷共享给多个 docker 容器 var lib docker目的地 一个最小的可重现示例如下 docker volume create name lib docker run privileged v lib v
  • 提高 apache 日志的精度以包括毫秒

    我修改了配置rsyslogd禁用RSYSLOG TraditionalFileFormat 但仍然是apache日志 var log apache error log仅显示第二精度 还有什么需要配置的吗 At http httpd apac
  • 如何在执行 apache HttpPost 时将 UrlEncodedFormEntity 中的空格编码为 %20?

    我正在访问的网络服务需要 URLEncodedFormEntity 形式的参数 我无法根据 Web 服务的要求将空间更改为 20 而是将空间转换为 我的代码是 HttpClient client new DefaultHttpClient
  • 如何在 Docker 容器内动态添加 Jenkins 用户和权限

    当我为 python 项目构建声明式 Jenkins 管道时 使用 Pip 时收到以下错误消息 WARNING The directory cache pip or its parent directory is not owned or
  • Rancher 外部子域

    我需要为 docker 容器中的应用程序设置子域 而不是在内部牧场主网络中 而是供公共使用 我已将域委托给牧场主服务器 并且目录中几乎所有堆栈都有主机属性 但它不起作用 我想我需要使用一些 rancher dns 委托域或设置 nginx
  • Apache mod_rewrite:在 Windows 计算机上使用 PHP 脚本的 RewriteMap 指令

    这已经让我发疯了 我似乎无法让 RewriteMap 指令适用于 Windows 上的 php 脚本 这是我的 httpd conf 文件中的相关片段
  • 如何在 Apache POI 中获取 Excel 空白单元格值?

    我有一个巨大的 Excel 文件 其中包含大量列 如下所示 Column1 Column2 Column3 Column4 Column5 abc def ghi mno pqr 这是我编写的用于打印这些值的代码 try FileInput
  • Amazon ECS - 在 Docker 入口点上使用 IAM 角色时权限被拒绝

    我正在寻找一种将机密 证书注入 Amazon ECS 容器的方法 就我而言 它是一个简单的 nginx 容器 我一直在使用 AWS Parameter Store 关注这篇文章 https aws amazon com blogs comp
  • 使用 HornetQ (JBoss) 在 docker 容器上公开的 JMS 所需的端口

    我正在使用 Docker 将 JMS 服务器容器链接到另一个 JMS 客户端容器 但是当我在docker容器中运行服务器时 客户端无法正确连接到服务器 我在docker上暴露了端口443 JMS还有其他使用的端口吗 我可以成功创建目标 但不
  • 在 Apache 服务器上处理 React Router

    我在重定向 Apache 服务器上 React 生成的 URL 路径的 404 错误时遇到问题 设想 假设我有一些由 React Router 生成的 URL www somewebsite com apps Problem 如果最终用户单
  • Docker 与 nginx 组合不断显示欢迎页面

    我是新来的docker并尝试使用最简单的 docker compose yml 显示一个 hello world 页面 并在此基础上构建最终完整的LEMP堆栈它将与我的服务器具有相同的配置 然而大多数教程已经过时 并且有很多使用方法dock
  • 在 docker build 中缓存“go get”

    我想将 golang 单元测试封装在 docker compose 脚本中 因为它依赖于多个外部服务 我的应用程序有很多依赖项 因此需要一段时间go get 如何以允许构建 docker 容器的方式缓存包 而无需每次要测试时下载所有依赖项
  • PHP/Apache 中的输出缓冲块如何工作?

    假设我将随机数据从 PHP 回显到浏览器 随机数据总量约为 XGb 回显以 YKb 块的形式完成 不使用 ob start PHP 和 Apache 缓冲区已满后 echo 调用是否会阻塞 客户端无法以与生成数据相同的速度使用数据 如果是

随机推荐