我正在使用docker-compose和docker存储库中的官方wordpress映像设置Wordpress本地环境。
我在窗户上。
问题是我在wp内容上存在一些权限问题,并且无法从Wordpress管理面板上载文件。
然后我检查了容器内的文件权限,这是输出:
如您所见,我的wp-content
的所有者是root
,而不是www-data
。
立即的解决方案是打开容器的bash并给予
chown -R www-data:www-data /var/www/html/wp-content/
这当然可以,但是我不想每次启动一个新的wordpress项目时都执行此过程。为此,我创建了一个Dockerfile
,如下所示:
FROM wordpress:5.1.1
# install dos2unix (fix problem between CRLF and LF)
RUN apt-get update
RUN apt-get install -y dos2unix
# increase upload limit
RUN touch /usr/local/etc/php/conf.d/uploads.ini \
&& echo "upload_max_filesize = 10M;" >> /usr/local/etc/php/conf.d/uploads.ini
# fix permissions issues
COPY entrypoint.sh /
RUN dos2unix /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
我的entrypoint.sh
看起来像这样:
#!/bin/bash
echo Fixing permissions...
chown -R www-data:www-data /var/www/html/wp-content/
但是后来我意识到我覆盖了原始wordpress图片的ENTRYPOINT
,并且容器始终以code 0
退出。
然后我尝试使用CMD
而不是ENTRYPOINT
,并且这样更改了Dockerfile
:
FROM wordpress:5.1.1
# increase upload limit
RUN touch /usr/local/etc/php/conf.d/uploads.ini \
&& echo "upload_max_filesize = 10M;" >> /usr/local/etc/php/conf.d/uploads.ini
CMD chown -R www-data:www-data /var/www/html/wpcontent/
但是我总是收到文件或文件夹不存在的错误。
我也尝试使用CMD
,如下所示:
CMD ["chown", "-R", "www-data:www-data", "/var/www/html/wp-content/"]
但没有成功。
有一种方法可以在原始ENTRYPOINT
的之后运行命令?
您是否知道另外一种解决此问题的更好方法?
答案 0 :(得分:4)
您可以修改./entrypoint.sh
脚本,以在执行chown命令后运行原始图像的默认入口点脚本:
#!/bin/bash
echo Fixing permissions...
chown -R www-data:www-data /var/www/html/wp-content/
docker-entrypoint.sh apache2-foreground
答案 1 :(得分:2)
这是由于创建WordPress Docker映像的方式所致。
我创建了一个Pull Request,使其在使用卷共享wp-content
文件夹(或其子文件夹)时属于www-data
。
在合并之前(如果是),您可以创建自己的WordPress Docker映像以集成我的更改。在https://github.com/docker-library/wordpress上选择一个文件夹(选择PHP版本,然后选择Web服务器参数)。
docker/wordpress
文件夹。 if [ "$(id -u)" = '0' ] && [ "$(stat -c '%u:%g' .)" = '0:0' ]; then
chown "$user:$group" .
fi
作者:
if [ "$(id -u)" = '0' ]; then
chown -R "$user:$group" .
fi
答案 2 :(得分:0)
从Docker文档中,您应该使用的命令是RUN
。
不要将RUN与CMD混淆。 RUN实际上运行命令并提交结果。 CMD在生成时不执行任何操作,但会指定映像的预期命令。
因此,Dockerfile中的行应为:
RUN chown -R www-data:www-data /var/www/html/wp-content
此外,为了减少创建的层数和图像的大小,我将尽可能多的RUN
命令链接起来。例如(未经测试):
FROM wordpress:5.1.1
# install dos2unix (fix problem between CRLF and LF) and increase upload limit
RUN apt-get update -y && \
apt-get install -y dos2unix && \
touch /usr/local/etc/php/conf.d/uploads.ini \
&& echo "upload_max_filesize = 10M;" >> /usr/local/etc/php/conf.d/uploads.ini && \
chown -R www-data:www-data /var/www/html/wp-content
# fix permissions issues
COPY entrypoint.sh /
RUN dos2unix /entrypoint.sh && \
chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
答案 3 :(得分:0)
父docker-entrypoint.sh
在您的Dockerfile
和entrypoint.sh
之后运行,覆盖了您设置的权限。
自定义入口点执行延迟的命令,该命令在docker-entrypoint.sh
运行后设置所有权。
您的 Dockerfile
FROM wordpress:php7.4-apache
[...]
ENTRYPOINT ["/entrypoint.sh"]
您的 entrypoint.sh
# In 10 seconds set the ownership
$(sleep 10 && chown -R www-data:www-data /var/www/html/) &
# Run the parent's ENTRYPOINT and CMD as defined in its Dockerfile
# (https://github.com/gsusI/wordpress/blob/master/php7.4/apache/Dockerfile)
docker-entrypoint.sh apache2-foreground # run parent entrypoint.
注意:手动调用父级的ENTRYPOINT和CMD意味着,如果父级Dockerfile更改了其后两行,则该解决方案可能无法正常工作。
因此,建议您在更新
FROM
时,检查父级的Dockerfile以验证最后两行仍然是ENTRYPOINT ["docker-entrypoint.sh"] CMD ["apache2-foreground"]