我根据官方的WordPress图片创建了一个新的Dockerfile
,我一直在尝试解决为什么我无法删除默认主题。我发现原因是因为在执行命令时文件实际上还不存在。
以下是我的Dockerfile中的相关行:
FROM wordpress
RUN rm -rf /var/www/html/wp-content/themes/twenty*
如果我在容器运行后手动运行它,delete命令会按预期工作。
作为旁注,我还发现当我将其他自定义主题从/var/www/html/wp-content/themes
复制到Dockerfile
目录时,它确实有效,但并不像我期望的那样。因为官方docker镜像中的任何文件都会覆盖同一文件的自定义版本。如果我想提供自己的配置文件,我会想到这会以相反的方式工作。
所以我实际上有两个问题:
Dockerfile
异步运行延迟命令?答案 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,但我不知道在这个容器中可能是这种情况)。
我希望有所帮助! :)