docker 容器中的权限仅部分使用 chown

Permission in docker Container just partly working with chown

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

#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): failed to open stream: Permission denied

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

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

关于你最后的评论

The two files are created by the Entrypoint of the code /var/www/html/app/Console/cake schema update -y. So this is executed by the root user. Is it possible to say to execute this as www-data not as root?

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

USER www-data

这样,此行之后的所有内容 运行 都将属于该用户。