然而

然而

我正在为我的应用程序构建 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主机,它将在组合卷安装时被继承。

相关内容