在Docker WordPress图像是什么原因导致应用程序文件复制延迟?

我已经创build了一个新的基于官方WordPress图像的Dockerfile ,我一直试图解决为什么我不能删除默认的主题。 我发现原因是因为在执行命令时文件实际上还没有存在。

这里是我的Dockerfile的相关行:

 FROM wordpress RUN rm -rf /var/www/html/wp-content/themes/twenty* 

如果我在容器运行后手动运行它,那么delete命令将按预期工作。

作为一个侧面说明,我也发现,当我复制额外的自定义主题到/var/www/html/wp-content/themes目录,从Dockerfile ,它的工作,但不是我所期望的。 因为官方docker镜像中的任何文件都会覆盖同一个文件的自定义版本。 如果我想提供自己的configuration文件的话,我会想象得到这个方法。

所以我其实有两个问题:

  1. 这是与Docker相关的行为吗? 或者是在WordPress的特定图像?
  2. 我该如何解决这个问题? 这感觉就像一个黑客,但有没有办法从Dockerfileasynchronous运行延迟命令?

怎么了,本!

您的问题与Docker命名的entrypoint引入的概念有关。 它通常是一个在运行容器时执行的脚本,包含需要在运行时运行的操作,而不是构build时间。 该脚本在运行映像后立即运行。 它们被用来使容器像服务一样行事。 使用CMD指令设置的参数默认情况下是直接传递给入口点的参数,并且可以被覆盖。

你可以在这里find你要拖动的图像的Dockerfile的debian模板。 正如你所看到的,它调用一个名为docker-entrypoint.sh的入口docker-entrypoint.sh 。 由于我不想太深入,基本上,它正在执行你的应用程序的安装。

由于您正在inheritanceWordPress图片,所以wordpress图片的入口点正在执行。 覆盖它,以便它不再执行也不是一个好主意,因为它会使你的图像无用。

在这种情况下,一个简单的黑客将是以下内容:

 FROM wordpress RUN sed -i 's/exec \"\$\@\"/exec \"rm -rf \/var\/www\/html\/wp-content\/themes\/twenty\* \&\& \$\@\"/g' 

这将重写入口点,使最后一个exec子句删除这些文件,并运行它决定运行的任何服务(通常是Apache,但我不知道在这个容器中可能是这种情况)。

我希望有帮助! 🙂