【问题标题】:Permission in docker Container just partly working with chowndocker Container 中的权限只是部分使用 chown
【发布时间】:2019-12-15 01:54:49
【问题描述】:

我在 Docker 容器中的访问权限存在问题。我将一个文件夹从主机复制到 docker 映像到文件夹 /var/www/html 中。此文件夹具有更深的文件夹结构。然后,我希望正在执行 apache 的 www-data 能够访问完整的 /var/www/html 文件夹。我使用以下 dockerfile 创建容器。

#start with base Image from php 
FROM php:7.3-apache

#install system dependencies and enable PHP modules

RUN apt-get update && apt-get install -y \
      libicu-dev \
      libpq-dev \
      libmcrypt-dev \
      mysql-client \
      git \
      zip \
      unzip \
    && rm -r /var/lib/apt/lists/* \
    && docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \
    && docker-php-ext-install \
      intl \
      mbstring \
      pcntl \
      pdo_mysql \
      pdo_pgsql \
      pgsql \
      opcache

#     zip \
#     mcrypt \

#configure imap for mails
RUN apt-get update && \
    apt-get install -y \
        libc-client-dev libkrb5-dev && \
    rm -r /var/lib/apt/lists/*

RUN docker-php-ext-configure imap --with-kerberos --with-imap-ssl && \
docker-php-ext-install -j$(nproc) imap   

#install mcrypt
RUN apt-get update \
    && apt-get install -y libmcrypt-dev \
    && rm -rf /var/lib/apt/lists/* \
    && pecl install mcrypt-1.0.2 \
    && docker-php-ext-enable mcrypt

#install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer

#set our application folder as an environment variable
ENV APP_HOME /var/www/html

#change uid and gid of apache to docker user uid/gid
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data

# enable apache module rewrite
RUN a2enmod rewrite

#COPY Data to html
COPY --chown=www-data:www-data AppBare/ /var/www/html

#change ownership of our applications
RUN chown -R www-data:www-data /var/www/html

#Copy file to start schema update on startup
ENTRYPOINT [ "sh", "-c", "/var/www/html/app/Console/cake schema update -y && /var/www/html/app/Console/cake migration && /usr/sbin/apachectl -D FOREGROUND"]

EXPOSE 80

创建并启动容器后,我在访问服务网络服务器的网站时收到以下错误消息。然而,它也在加载带有复制图像的网站,所以基本上,用户可以访问例如图片、css等。

SplFileInfo::openFile(/var/www/html/app/tmp/cache/models/demo_backend_cake_model_default_backend_dockertest_list): 无法打开流:权限被拒绝

当我进入容器的控制台并使用 chown 命令重置权限时,问题就消失了。所以命令本身一定是对的。此外,当我创建一个卷并将文件夹从主机安装到 /var/www/html, 时,一切正常。

如何授予用户对该文件夹的完全访问权限?我还尝试在复制数据之前切换授予访问权限,但这也不起作用。

【问题讨论】:

  • 能否在容器内手动更改权限之前打印ls -l /var/www/html的结果?
  • 当我在 dockerfile 中执行您的代码时,它会显示-rwxr-xr-x 1 root root。当我在文件夹/var/www/html/app/tmp 中查看正在运行的容器时,使用了导致错误的错误权限,它说-rw-rw-r-- 1 root root 其他像/var/www/html-rwxrwxrwx 1 www-data www-data
  • 当我启动容器时似乎权限正在改变。当我查看进程时,apachectl 以 root 身份运行。这可能是个问题吗?
  • 这很奇怪...我无法重现您的错误...我有一个来自同一基本映像的简单 docker 文件,我已经复制了您的行 RUN usermod ... COPY --chown...RUN chown -R...并且我没有权限问题。
  • 另外 apachectl 以 root 身份运行,因为它是使用 docker 时的默认用户。除非您的 dockerfile 中有 USER 指令,否则您的文件中不是这种情况,基础映像中也不是 php:7.3-apache

标签: docker chown


【解决方案1】:

关于你的上一条评论

这两个文件是由代码/var/www/html/app/Console/cake schema update -y的Entrypoint创建的。所以这是由root用户执行的。是否可以说以 www-data 而不是 root 身份执行此操作?

答案是肯定的。您必须在入口点之前添加以下行:

USER www-data

这样,此行之后运行的所有内容都将与该用户一起使用。

【讨论】:

  • 就是这样。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-10-08
  • 2020-10-23
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2019-08-20
  • 2021-02-20
  • 2019-06-27
相关资源
最近更新 更多