如何使用docker-compose

时间:2019-04-18 13:27:19

标签: wordpress docker docker-compose

问题


我正在使用docker-compose和docker存储库中的官方wordpress映像设置Wordpress本地环境。

我在窗户上。

问题是我在wp内容上存在一些权限问题,并且无法从Wordpress管理面板上载文件。 wordpress error unable to create directory

我已经完成的事情


然后我检查了容器内的文件权限,这是输出:

file permissions in the wordpress container

如您所见,我的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之后运行命令?
您是否知道另外一种解决此问题的更好方法?

4 个答案:

答案 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服务器参数)。

  1. 在项目中创建一个docker/wordpress文件夹。
  2. 将来自GitHub的两个原始文件( Dockerfile docker-entrypoint.sh )复制到该文件夹​​中。
  3. 将这些行替换为 docker-entrypoint.sh
        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在您的Dockerfileentrypoint.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"]