如何指定WordPress Docker镜像的文件存放路径?
当前你通过Docker Compose + Caddy成功部署了两个WordPress站点,但需要手动下载WordPress源码到宿主机挂载目录,原因是官方WordPress镜像默认只在容器的/var/www/html目录为空时自动解压源码。以下是几种无需手动下载的解决方案:
方案1:调整挂载路径,利用官方镜像自动初始化
这是最简单的方法,核心是让WordPress容器的默认目录(/var/www/html)直接挂载到宿主机对应站点的目录,让镜像自动完成源码解压,再通过环境变量配置WordPress的站点URL。
修改docker-compose.yml中的WordPress服务配置
以第一个站点为例:
wordpress: depends_on: - db image: wordpress:6.1-php8.1-fpm-alpine restart: always environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: exampleuser WORDPRESS_DB_PASSWORD: examplepass WORDPRESS_DB_NAME: exampledb # 指定WordPress的站点地址,避免路径错误 WORDPRESS_CONFIG_EXTRA: | define('WP_HOME', 'https://testwp.domain.nl'); define('WP_SITEURL', 'https://testwp.domain.nl'); volumes: # 将宿主机的站点目录直接挂载到容器默认的/var/www/html - ./caddy/sites/testwp/wordpress:/var/www/html
第二个站点同理修改:
wordpress2: depends_on: - db2 image: wordpress:6.1-php8.1-fpm-alpine restart: always environment: WORDPRESS_DB_HOST: db2 WORDPRESS_DB_USER: exampleuser WORDPRESS_DB_PASSWORD: examplepass WORDPRESS_DB_NAME: exampledb WORDPRESS_CONFIG_EXTRA: | define('WP_HOME', 'https://testwp2.domain.nl'); define('WP_SITEURL', 'https://testwp2.domain.nl'); volumes: - ./caddy/sites/testwp2/wordpress:/var/www/html
Caddyfile无需修改
原有的Caddy配置保持不变,因为Caddy挂载的./caddy/sites对应容器内的/var/www/html,站点目录的路径匹配依然有效:
testwp.domain.nl { root * /var/www/html/testwp/wordpress php_fastcgi wordpress:9000 file_server } testwp2.domain.nl { root * /var/www/html/testwp2/wordpress php_fastcgi wordpress2:9000 file_server }
启动容器后,WordPress镜像会自动将源码解压到/var/www/html(即宿主机的./caddy/sites/testwp/wordpress),无需手动下载。
方案2:自定义启动命令,复制源码到目标目录
如果不想调整挂载路径,可以在容器启动时自动将官方镜像默认目录的源码复制到你指定的目录:
修改docker-compose.yml中的WordPress服务command
wordpress: # 其他配置保持不变 command: sh -c " # 检查目标目录是否为空,为空则复制源码 if [ -z \"$(ls -A /var/www/html/testwp/wordpress)\" ]; then cp -r /var/www/html/* /var/www/html/testwp/wordpress/; fi; # 执行原启动脚本 exec docker-entrypoint.sh php-fpm " volumes: - ./caddy/sites/testwp/wordpress:/var/www/html/testwp/wordpress
这个方法会在容器第一次启动时复制源码,后续启动因为目标目录已有内容,不会重复复制,避免覆盖自定义配置。
方案3:自定义WordPress镜像(进阶)
如果你需要长期使用自定义根目录,可以基于官方镜像构建自己的镜像,修改初始化脚本的目标目录:
- 创建
Dockerfile:
FROM wordpress:6.1-php8.1-fpm-alpine # 复制官方entrypoint脚本并修改 COPY docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh
复制官方镜像的
docker-entrypoint.sh,找到其中定义WP_ROOT的部分,将WP_ROOT="/var/www/html"改为你需要的目录(比如/var/www/html/testwp/wordpress)。构建镜像并在docker-compose中使用自定义镜像。
这个方法适合需要批量部署相同自定义配置的场景,但维护成本较高。
内容的提问来源于stack exchange,提问作者Freek

