发布于 2026-01-06 5 阅读
0

使用 Docker 进行 WordPress 开发的目标、基础 Docker 镜像文件夹结构、Dockerfile、入口脚本、Docker Compose

使用 Docker 进行 WordPress 开发

目标

基础 Docker 镜像

文件夹结构

Dockerfile

入口脚本

Docker Compose

我最近的一大爱好就是尽可能保持操作系统干净。为了做到这一点,我尽量少安装任何软件。

Node.js 让这项工作变得非常简单,我只需要node全局安装依赖项,其他所有东西都可以安装在项目目录下。然而,对于许多其他语言,例如 PythonPython和 Java PHP,情况往往并非如此。此外,当每个项目都需要不同的环境配置时,管理所有内容很快就会变成一项繁琐的工作,有时甚至会导致整个系统崩溃。

Docker来帮忙了。

Docker 主要用于控制生产和团队协作环境,但它对于封装开发环境和提供“干净的画布”也非常有用,以确保不会发生意外的破坏。


目标

构建 Docker 开发系统时,我通常会考虑以下要求:

  • 最小卷挂载:在已挂载的主机卷上进行文件 I/O 操作速度较慢(在 Windows 和 Mac 系统上),因此您只需要挂载您将要编辑的源代码文件。其他文件应在构建镜像时复制。
  • 无需运行时安装:依赖项和第三方插件不应在容器运行时安装,尤其是不需要网络连接的依赖项和第三方插件,以确保恢复开发时能够快速启动。它们应该在构建镜像时安装。
  • 主机上第三方组件越少越好:如果可能,依赖项和第三方插件应从互联网获取(通过类似 `--plugins`package.json或 ` --plugins` 的配置文件,Gemfile甚至直接列在Dockerfile`/etc ...
    • 从主机复制大量文件到镜像非常慢。
    • 在 Git 目录中存放大量第三方文件会很混乱。
  • 可追踪的快照:您应该能够对当前的开发进度进行快照(尤其是在 WordPress 的情况下,如下所述),并且这些快照应该能够在 git 存储库中进行追踪。

基础 Docker 镜像

在WordPress开发中,我使用[此处应chriszarate/wordpress填写插件名称],因为它通过环境变量提供了一系列有用的功能,包括:

  • 容器启动时自动激活插件。因为没人想每次都手动激活主题。但是,一旦开始使用数据库快照,这一点就无关紧要了。
  • 容器启动时自动激活主题。同样,一旦开始使用数据库快照,此功能就变得无关紧要了。
  • 向 .追加额外的 PHP 代码wp-config.php
  • 预先配置管理员用户名、管理员密码、管理员邮箱和网站网址,以跳过枯燥的欢迎设置屏幕。

这个 Docker 镜像背后的奥秘在于,它在官方 Docker 镜像的wp-cli默认入口点中添加了一组脚本docker-entrypoint.shwordpress


文件夹结构

这是我的 WordPress 开发目录的文件夹结构,它分为 3 个主要部分(截图中的名称不太清晰,但下图有详细的解释):

  • 源代码:您当前正在开发的插件和主题。它们是文本文件(例如.php.css.js .xml、.ts 等),您将在项目的大部分时间里创建和更改这些文件。
  • 第三方插件:这些是您的网站所需的第三方插件,也是您的项目或您正在为其创建子主题的父主题的依赖项。它们应该以 zip 文件的形式保存在这些文件夹中,或者在 . 中指定为 URL Dockerfile
  • 快照:包括 WordPress 数据库的 sql 转储和wp-content/uploads文件夹的压缩文件(如果您正在构建内容或从主题的演示内容开始)。

通过这种结构,第三方和快照将被构建到镜像中,而源代码将被挂载,以便在开发过程中进行更改。

docker-entrypoint.shdocker-entrypoint.sh是原始 Docker 镜像的默认入口点,我们将对其进行修改(见下文)以满足我们的需求。


Dockerfile

例如Dockerfile,请查看此要点。

包裹

对于 Dockerfile 配置,我安装了以下软件包:

  • unzip如上所述,快照和第三方数据都以 zip 文件格式保存(远程获取的数据也以 zip 格式保存)。我们需要使用此工具来解压缩它们。
  • mysql-client该软件包提供了wp dbWordPress 数据库导出和导入.sql快照所需的必要命令。
  • [可选] wget:如果依赖项是从远程获取的,我们会使用指定的 URL 下载wget它们
FROM chriszarate/wordpress:4.9.1

RUN \
    apt-get update && \
    apt-get install unzip wget mysql-client -y && \
    rm -rf /var/lib/apt/lists/*

第三方和快照

我们将每个第三方 zip 文件目录复制到镜像上的一个临时文件夹(或通过下载wget),然后解压并删除所有 zip 文件。这些文件夹的内容将在运行时由 复制到实际的目标目录docker-entrypoint.sh

我们不直接将它们复制到实际目标文件夹的原因是,它们会被官方 WordPress 镜像中的命令覆盖docker-entrypoint.sh

# If copied from folder
COPY ./plugins/ /temp/plugins
# If downloaded via url
wget -P /temp/plugins/ https://downloads.wordpress.org/plugin/jetpack.5.9.zip
# Extract and delete zip files
RUN unzip '/temp/plugins/*.zip' -d /temp/plugins && rm /temp/plugins/*.zip || true;

|| true添加此代码是为了确保在没有 zip 文件时脚本不会失败并终止镜像构建过程。

同样地,我们将快照文件(如果有)复制到镜像中。该uploads.zip文件应像上面那样解压缩,wordpress.sql之后将由docker-entrypoint.sh.

入口点和配置

我们需要用修改后的脚本替换默认脚本。由于官方 Docker 镜像中已经声明了默认脚本,因此docker-entrypoint.sh无需额外指定。ENTRYPOINT

COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh

此外,将您自己的 PHP 上传配置(例如在您的代码仓库中)插入到镜像中也很有用uploads.ini。显然,您可以使用相同的方法配置其他内部系统文件:将自定义文件复制到镜像内的绝对路径。

COPY ./uploads.ini /usr/local/etc/php/conf.d/uploads.ini

入口脚本

例如docker-entrypoint.sh,请查看此要点。

是时候进行修改了。首先,我们需要docker-entrypoint.sh从原脚本克隆一份,然后将目录中的所有文件复制到它们应该在的位置。这些代码行需要放在插件和主题激活之前。chriszarate/wordpress/temp/

CONTENT_DIR=$ROOT_DIR/wp-content
THEME_DIR=$CONTENT_DIR/themes
PLUGIN_DIR=$CONTENT_DIR/plugins

cp -r /temp/themes/* $THEME_DIR || true
cp -r /temp/plugins/* $PLUGIN_DIR || true
cp -r /temp/base/* $CONTENT_DIR || true

# Activate plugins. Install if it cannot be found locally.
# ...

需要注意的是,所有这些文件和文件夹都属于root用户所有,因此 WordPress 没有写入权限。如果您需要授予 WordPress 对这些目录的权限,则需要插入类似这样的代码:

chown -R $WEB_USER:$WEB_USER $ROOT_DIR/wp-content/uploads

最后,当所有步骤完成后,docker-entrypoint.sh我们需要导入wordpress.sql文件。我们将这行代码放在文件末尾,紧接在 `import` 语句之前exec "$@",以确保我们的数据库不会被任何内容覆盖。

runuser $WEB_USER -s /bin/sh -c "wp db import $CONTENT_DIR/wordpress.sql"

exec "$@"

Docker Compose

配置方面,您可以在chriszarate 的代码仓库docker-compose中找到示例。它结合了两个服务:一个用于 PHP WordPress 安装,另一个用于数据库。这里只需要修改几处:wordpressmysql

  • 构建你的 Dockerfile:而不是chriszarate/wordpress直接使用镜像。
services:
  wordpress:
    build: .
  • 请根据项目需求,逐个挂载源代码。不要挂载整个themes目录,plugins因为容器内的源代码版本已经包含了其他文件。
volumes:
  - "./src/themes/my-custom-theme:/var/www/html/wp-content/themes/my-custom-theme"
  - "./src/plugins/my-custom-plugin:/var/www/html/wp-content/plugins/my-custom-plugin"
  • 仅限本地:WORDPRESS_ACTIVATE_PLUGINS仅列出 Docker 镜像内部以及环境变量中已安装的插件和主题WORDPRESS_ACTIVATE_THEME。否则,入口脚本将尝试从互联网下载它们,从而延长启动时间。

现在一切就绪。接下来,我们可以清理掉 XAMPP 或 MAMP 的所有程序,或者干脆删除所有东西,重新安装操作系统,或者更好的办法是,直接把电脑扔掉,换一台全新的。祝你玩得开心。

文章来源:https://dev.to/netcell/wordpress-development-with-docker-2jk9