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

时间:2020-08-31 17:12:38

标签: apache docker dockerfile containers root

我正在从以下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 configtest失败。 ... (警告)。 配置测试的输出为: mkdir:无法创建目录“ / var / run / apache2”:权限被拒绝 chown:更改“ /var/lock/apache2.3FGoa8Y71E”的所有权:不允许操作

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

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

2 个答案:

答案 0 :(得分:0)

在Docker中,所有文件夹均归True所有。不知道您的目录结构,我想您的问题是,您的用户 1001 (或在获得root许可的情况下运行的安装程序)试图访问(可能)是由1001拥有。

您可以尝试:

  1. 更改文件夹的权限。

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

    root
  2. 授予用户适当的权限。

    这是一个非常快的演练。如果无法解决您的问题,请发表评论,我将尝试对其进行更新以获得更具体的答案。

    一个小例子(摘自here)。 您可以使用无密码访问权限来设置非root用户chmod -R 777 /path/to/folder

    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

    sudo

    现在,尝试使用apt-get install sudo 运行入口点(或您的命令)。


编辑: 我已经更新了答案以匹配您的Docker-File。看看它。为用户非根用户分配了uuid 1001 ,并将其添加到sudo中。另外,您的命令现在也使用sudo运行,这应该可以防止权限问题。

/etc/sudoers

答案 1 :(得分:0)

这里的问题:apache是​​特殊用户。它只能由root用户启动。 您不能由其他用户启动apache。那就是为什么您拒绝许可。 看到我看到了您的dockerfile。您创建的用户是普通用户。

尝试使用以下名称为apache-start的脚本制作脚本:

    #!/bin/sh
set -e
# Apache gets grumpy about PID files pre-existing
rm -f /usr/local/apache2/logs/httpd.pid
exec httpd -DFOREGROUND "$@"

您的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
COPY apache-start /usr/local/bin/
CMD ["apache-start"]
USER 1001