首页 > 解决方案 > 如何以非 root 用户身份运行 Apache?

问题描述

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

DockerFile

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 用户身份正确运行容器。关于如何让容器以非 root 用户身份正常运行的任何建议?

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

标签: apachedockerdockerfilecontainersroot

解决方案


在 Docker 中,所有文件夹都归root. 在不知道您的目录结构的情况下,我猜您的问题是,您的用户1001(或以 ' 的权限运行的安装程序1001)试图访问(可能)由root.

您可以尝试:

  1. 更改文件夹的权限。

    这可以用于您知道哪些文件夹被访问并希望防止进一步的权限问题。

    chmod -R 777 /path/to/folder
    
  2. 给你的用户适当的权限。

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

    一个小例子(取自这里)。foo您可以使用无密码访问设置非 root 用户:

    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
    

    提示:您可能需要安装sudo

    apt-get install sudo
    

    现在,尝试使用sudo.


编辑:我已经更新了答案以匹配您的 Docker 文件。看看它。用户 nonroot 被分配 uuid 1001并添加到/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" ]

推荐阅读