我正在为我的应用程序构建 Docker 映像Symfony
,我需要授予 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 用户?
答案1
我遇到了同样的问题,如果在一层中创建目录内容而在其他层中更改其权限,则似乎 docker 或 overlay2 中存在一些错误。
作为一种解决方法,您可以将源复制到临时目录:
COPY . /src
然后将其移动到/var/www/html
并设置权限(在一个RUN
命令中):
RUN rm -rf /var/www/html && mv /src /var/www/html &&\
find /var/www/html/ -type d -exec chmod 755 {} \; &&\
find /var/www/html/ -type f -exec chmod 644 {} \; &&\
chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs
我也创建了GitHub 问题。
答案2
尝试添加:
USER root
它对我有用。
答案3
Docker 中 RUN 的默认 shell 是 /bin/sh,这里由于权限设置不正确而出现了问题。
但是你可以改为只使用 /bin/bash 来轻松修复,注意目录列表之前和之后。
Step 7/9 : RUN /bin/bash -c 'ls -la; chmod +x gitlab-properties-builder.sh; ls -la'
---> Running in dc57ae77aa67
drwxr-xr-x. 3 root root 103 Mar 8 17:56 .
drwxr-xr-x. 1 root root 46 Mar 8 17:57 ..
drwxr-xr-x. 2 root root 6 Mar 7 20:47 config
-rw-r--r--. 1 root root 2340 Mar 7 21:20 gitlab-properties-builder.sh
-rw-r--r--. 5 root root 57325770 Mar 5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jar
drwxr-xr-x. 1 root root 42 Mar 8 17:56 .
drwxr-xr-x. 1 root root 61 Mar 8 17:57 ..
drwxr-xr-x. 2 root root 6 Mar 7 20:47 config
-rwxr-xr-x. 1 root root 2340 Mar 7 21:20 gitlab-properties-builder.sh
-rw-r--r--. 5 root root 57325770 Mar 5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jar
---> 8b5de6e348d3
答案4
我刚刚做了以下实验:
FROM alpine
LABEL MAINTAINER="YIMGA YIMGA Salathiel Genèse"
RUN apk add --no-cache inotify-tools
CMD [ "./script.sh" ]
WORKDIR /opt/app/
COPY src/ /opt/app/
RUN chmod a+x *.sh
而且它的效果非常好。
然而
当我通过 docker-compose 卷覆盖该可执行文件时,权限execute
就像回滚一样 - 从技术上讲覆盖了原始文件权限。
修复开发模式只是来自chmod a+x yourfile
主机,它将在组合卷安装时被继承。