【发布时间】:2017-12-11 20:57:57
【问题描述】:
我有一个由docker-compose 文件生成的wordpress 容器。 Wordpress 容器默认包含.htaccess 文件。我想编辑它,以便在创建容器时只执行一次编辑。
【问题讨论】:
标签: wordpress .htaccess docker docker-compose
我有一个由docker-compose 文件生成的wordpress 容器。 Wordpress 容器默认包含.htaccess 文件。我想编辑它,以便在创建容器时只执行一次编辑。
【问题讨论】:
标签: wordpress .htaccess docker docker-compose
最简单的方法是在wordpress:with-netcat的基础上创建自己的图片,并做好所有必要的准备工作:
FROM wordpress:with-netcat
RUN /. EDIT YOUR .htaccess file here ./
ENTRYPOINT ...
CMD ...
并使用此图像而不是原始图像。
【讨论】:
docker-entrypoint.sh 覆盖。它将所有内容复制到var/html/www,从而也将替换我的文件。
docker-entrypoint.sh发现,在将所有内容复制到var/html/www时,在修改.htaccess文件之前有一个条件检查。
目前我可以想到两种可能的解决方案:
我们可以使用静态.htaccess 文件并将其作为卷安装在复制原始.htaccess 的位置,即容器内的/var/html/www。从更新到这个答案,我已经验证了这个.htaccess 文件默认不会被覆盖docker-entrypoint.sh。
我们可以使用来自github 的wordpress docker 的docker-entrypoint.sh 并修改创建.htaccess 文件的部分。这将保持入口点的默认行为,.htaccess 文件也将被修改。
更新:@Nazar 给出的答案也是正确的。仔细查看 wordpress 图像中的默认docker-entrypoint.sh,我发现line 35 有一个条件,它检查.htaccess 文件是否已经存在并仅在文件不存在时创建一个新文件时间>。因此,如果我使用 RUN 创建自己的文件,它不会被覆盖。
【讨论】:
如果您将主机上的目录挂载到 /var/www/html(例如使用 -v /host/path:/var/www/html 或类似名称时),这可能会很棘手 - 卷挂载会破坏(覆盖)映像中的任何内容。
如果您的主机没有任何挂载,只需添加COPY .htaccess /var/www/html/.htaccess(或使用RUN 修改现有的)即可。
要避免卷安装破坏映像的 htaccess 文件,请编写一个入口点脚本来覆盖该文件。因为入口点在挂载存在后运行,所以一定会生效。
创建一个自定义入口点 shell 脚本,将您的 htaccess 文件复制到 /var/www/html 然后触发默认入口点:
#!/usr/bin/env bash
# entrypoint.sh
cp /my-htaccess-file /var/www/html/.htaccess
# run the entrypoint from the ancestor image
docker-entrypoint.sh "$@"
然后在你的 Dockerfile 中将你自己的 htaccess 文件复制到一个已知位置,添加入口点脚本,并(重新)设置图像命令:
FROM wordpress:5.8.2-php7.4
COPY entrypoint.sh /my-entrypoint.sh
# RUN chmod +x /my-entrypoint.sh # uncomment if your source file is not executable
COPY .htaccess /my-htaccess-file
ENTRYPOINT ["/my-entrypoint.sh"]
# whenever the entrypoint is set, the command must also be set again
# this is the default CMD from the ancestor image.
CMD ["apache2-foreground"]
【讨论】: