chmod在Docker中无法正常工作


19

我正在为我的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命令会很有帮助。
迈克

我在您的上一个命令中看到一个多余的空间(我在手机上,所以不能确定)。由于权限问题似乎是与日志目录,更改最后一行:```运行chmod -R 777在/ var / www / html等/应用/缓存在/ var / www / html等/应用/日志```
迈克

1
好吧..我编辑了问题:)
风暴

那多余的空间是一个错字
风暴

我无法重现您的问题。如果我使用您的dockerfile并在本地设置一些虚拟文件,则权限是正确的,并且一切正常。我可以引导容器并通过Web浏览器访问内容。您可以更新您的问题以包括特定的错误消息吗?您确定您的Apache配置(apache2.conf)不会引起问题吗?如果不安装,错误会消失apache2.conf吗?
larsk's

Answers:


15

我有同样的问题,如果目录内容是在一层中创建而其权限在另一层中已更改,则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问题


我今晚打算深入研究我的旧源代码,以了解如何解决此问题,然后我想起了tmp目录技巧..希望这并不需要您花费很多时间来解决XD
风暴

7

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

2
为什么/bin/bash -c 'chmod +x file'工作而不工作/bin/sh -c 'chmod +x file'
风暴

你是更好的解决方案。它对我有用。谢谢 。
user1427944 '18

另外,使用新的buildkit可以在很多方面提供帮助,包括这一方面。试试看。docs.docker.com/develop/develop-images/build_enhancements
Thad Guidry,

6

尝试添加:

USER root

它为我工作。


这应该是公认的答案。
弗拉基米尔·科纳

2
如果切换到root用户,则在完成操作或降低容器的安全性和兼容性时,可能应该切换回上一个用户。例如,默认情况下,某些Kubernetes实现不会将容器作为root运行。
flickerfly

2

此问题可能VOLUME是上游Dockerfile中定义的结果。在Dockerfile中定义卷后,您可以使用COPYADD命令将文件直接添加到映像中。但是,RUN一行将:

  • 使用从dockerfile当前位置开始的映像定义创建一个临时容器
    • 该临时容器将在您安装匿名卷或在Dockerfile中指定父映像
    • 匿名卷将从图像的内容初始化
  • 您的命令将在容器内运行
    • 如果在此RUN命令期间列出目录,将看到已应用更改,但是这些更改已应用于卷
  • 当您的run命令完成时,docker将捕获对容器的更改
    • docker diff如果您不删除临时容器,则可以使用来查看这些更改(可以运行构建以--rm=false保留它们)
    • 这些更改将不包括匿名卷内容,因为它们在临时容器文件系统中不存在,卷是独立的

由于这种行为,您可以选择:

  1. 您可以将文件复制到其他目录并在那里更改权限
  2. 您可以修复主机上的权限,以便直接将这些权限复制到这些权限中
  3. 您可以从映像中删除卷,获取上游映像以删除其卷定义,也可以在没有卷定义的情况下重建自己的上游映像副本,并以此为基础创建映像

请注意,在当前的php映像中,似乎已删除了该卷,这意味着我们实际上拥有选项3。


0

我刚刚做了以下实验:

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从主机到主机,它将在撰写卷安装时继承。


1
卷的整个目标是从映像以外的其他位置挂载文件,因此,如果您修复映像并在其之上挂载卷,则根据设计,您将看不到映像更改。根据您拥有音量的原因,答案可能是根本没有音量。
BMitch

是的,BMitch,我完全同意从docker构建的映像中覆盖容器fs的安装卷的效果,但是...在开发过程中,您当然不想重建/重新启动容器以测试您的每一个更改做。在后一种情况下,您是否希望安装一个覆盖docker构建的映像fs的卷。在降落到这里之前,我也面临着同样的问题。我并没有因为回答问题而被定罪,而是对每个问题进行了测试。直到那时我才了解发生了什么,并发表了自己的看法……
SalathielGenèse18年

...而且我怀疑我遇到的情况与提出问题的人相同。
SalathielGenèse18年

OP表示他们仅通过docker run命令就看到了问题,没有安装外部卷。
BMitch

糟糕-我错过了这方面...正确问题标题的正确答案,但所描述的场景不是正确的。然后,我可以提到我无法重现上述问题。
SalathielGenèse18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.