Dockerfile“RUN chmod”没有生效

Posted

技术标签:

【中文标题】Dockerfile“RUN chmod”没有生效【英文标题】:Dockerfile "RUN chmod" not taking effect 【发布时间】:2019-09-26 10:38:21 【问题描述】:

其他一切都生效但权限没有改变,我错过了什么吗?

FROM joomla:3.9-php7.2-apache

RUN apt-get update \
&& apt-get install -y apt-utils vim curl

COPY ./joomla_html /var/www/html

RUN chmod -R 765 /var/www/html/

RUN chown -R www-data. /var/www/html/
RUN chmod -R 777 /var/www/html/tmp
RUN chmod -R 777 /tmp
RUN chmod -R 777 /var/www/html/modules
RUN chmod -R 777 /var/www/html/components
RUN chmod -R 777 /var/www/html/administrator/logs
RUN chmod -R 777 /var/www/html/images
RUN chmod -R 777 /var/www/html/uploads

COPY ./docker/php.ini /usr/local/etc/php/conf.d/php-extras.ini

EXPOSE 80

这是我得到的,每个文件都有 1000:1000 的权限,我需要它是 www-data

ls -la /var/www/html 的输出是

total 144
drwxr-xr-x 19 1000 1000 4096 May 8 18:53 .
drwxr-xr-x 1 root root 4096 May 8 02:30 ..
drwxr-xr-x 25 1000 1000 4096 May 8 18:53 components
drwxr-xr-x 6 1000 1000 4096 May 8 18:53 images
drwxr-xr-x 68 1000 1000 4096 May 8 18:53 modules
drwxr-xr-x 2 1000 1000 4096 May 8 18:53 tmp
drwxr-xr-x 2 1000 1000 4096 May 8 18:53 uploads

【问题讨论】:

哪些文件没有改变其权限?请提供确切问题的命令输出 @ignacio 没有。我更新了问题 【参考方案1】:

目录定义为上游卷:https://github.com/joomla/docker-joomla/blob/d34ff24288dfb5b27a167f870f1fcca56077be78/php7.2/apache/Dockerfile#L64

VOLUME /var/www/html

无法使用 RUN 命令修改卷。它们从具有卷的临时容器开始,并且只保存对容器的更改,而不是卷。

您可以尝试要求上游存储库更改其映像以从 Dockerfile 中删除卷定义。或者,您可以提取他们的存储库并构建您自己的基础映像版本,而无需卷。这些都不会阻止您稍后使用该目录中的卷运行容器。

否则,如果您想扩展映像并使用 RUN 命令进行更改,则需要将文件保存在另一个目录中。您还可以有一个入口点,在容器启动时将这些文件复制到 /var/www/html。

您也可以考虑多阶段构建,在第一阶段修复权限,然后在发布阶段将文件直接复制到卷中。正如您所注意到的,COPY 仍然适用于卷。它不是用临时容器实现的,因此可以将文件直接放在图像文件系统中。

【讨论】:

【参考方案2】:

你应该在复制文件时直接设置所有者:

FROM joomla:3.9-php7.2-apache

RUN apt-get update \
&& apt-get install -y apt-utils vim curl

COPY --chown=www-data:www-data ./joomla_html /var/www/html

RUN chmod -R 765 /var/www/html/

COPY ./docker/php.ini /usr/local/etc/php/conf.d/php-extras.ini

EXPOSE 80

【讨论】:

我已经在我的机器上试过了,它可以工作。你确定你正在重建你的形象?尝试给它一个不同的标签以确保 对于阅读此内容的人,请确保复制您的文件或文件夹(您自己的 joomla_html),不要用 presh 副本覆盖它。坏: COPY ./joomla_html /var/www/html RUN chmod +x /var/www/html COPY 。 . .好:复制。 .运行 chmod +x /var/www/html

以上是关于Dockerfile“RUN chmod”没有生效的主要内容,如果未能解决你的问题,请参考以下文章

DockerFile

docker-dockerfile

Dockerfile HEALTHCHECK健康检查

第五节——DockerFile

docker学习笔记17:Dockerfile 指令 ONBUILD介绍

Docker导出镜像与Dockerfile的简单应用及网络参数设置