【发布时间】: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