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

时间:2017-02-07 19:00:02

标签: wordpress docker dockerfile

我根据官方的WordPress图片创建了一个新的Dockerfile,我一直在尝试解决为什么我无法删除默认主题。我发现原因是因为在执行命令时文件实际上还不存在。

以下是我的Dockerfile中的相关行:

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

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

作为旁注,我还发现当我将其他自定义主题从/var/www/html/wp-content/themes复制到Dockerfile目录时,它确实有效,但并不像我期望的那样。因为官方docker镜像中的任何文件都会覆盖同一文件的自定义版本。如果我想提供自己的配置文件,我会想到这会以相反的方式工作。

所以我实际上有两个问题:

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

1 个答案:

答案 0 :(得分:1)

怎么了,本!

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

您可以找到要拉动的图像的Dockerfile的debian模板here。如您所见,它调用名为docker-entrypoint.sh的入口点。由于我不想过多地涉及它,基本上,它正在执行您的应用程序的安装。

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

在这种情况下可以使用的简单黑客如下:

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

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

我希望有所帮助! :)