我正在为我的Symfony
应用程序构建 Docker 映像,我需要授予 apache 服务器写入缓存和日志文件夹的权限
#Dockerfile
FROM php:7-apache
RUN apt-get update \
&& apt-get install -y libicu-dev freetds-common freetds-bin unixodbc \
&& docker-php-ext-install intl mbstring \
&& a2enmod rewrite
COPY app/php.ini /usr/local/etc/php/
COPY app/apache2.conf /etc/apache2/apache2.conf
COPY ./ /var/www/html
RUN find /var/www/html/ -type d -exec chmod 755 {} \;
RUN find /var/www/html/ -type f -exec chmod 644 {} \;
RUN chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs
当我使用构建此映像docker build -t myname/symfony_apps:latest .
并使用docker run -p 8080:80 myname/symfony_apps:latest
. Apache 日志被权限拒绝错误淹没,我检查过的奇怪的事情ls -a
和权限都很好。当我从容器的 bash 运行 chmod 时,apache 权限问题消失了,应用程序运行良好
情况
从 dockerfile 运行 chmod 命令:权限已更改,但 apache 仍然抱怨权限被拒绝。 在容器内使用 bash 运行 chmod 相同的命令:权限已更改,我的应用程序正在运行
任何想法,我是否遗漏了什么,也许我应该在 Dockerfile 的某个地方添加 root 用户?
我遇到了同样的问题,如果在一层中创建目录内容并且在另一层中更改了它的权限,那么在 docker 或 overlay2 中似乎存在一些错误。
作为一种解决方法,您可以将源复制到临时目录:
然后将其移至
/var/www/html
并设置权限(在一个RUN
命令中):我还创建了GitHub 问题。
尝试添加:
它对我有用。
Docker 中 RUN 的默认 shell 是 /bin/sh ,这就是权限设置不正确实际上有问题的地方。
但是您可以更改为只使用 /bin/bash 来轻松修复,注意目录列表之前和之后
这个问题很可能是
VOLUME
上游 Dockerfile 中定义的结果。在 Dockerfile 中定义卷后,您可以使用COPY
orADD
命令直接将文件添加到映像中。但是,RUN
一行将:RUN
命令期间列出目录,您将看到您的更改已应用,但这些更改已应用于卷docker diff
如果您不删除临时容器,则可以通过 a 看到这些更改(您可以运行构建以--rm=false
保留它们)由于这种行为,您可以选择:
请注意,在当前的 php 图像中,该卷似乎已被删除,这意味着我们实际上有选项 3。
我刚刚做了以下实验:
而且效果很好。
然而
当我通过 docker-compose 卷覆盖该可执行文件时,该
execute
权限就像回滚一样 - 从技术上讲覆盖了原始文件权限。开发模式的修复只是
chmod a+x yourfile
从主机,它将在组合卷安装时继承。