You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker镜像挂载本地卷后丢失COPY文件的解决方案咨询

问题原因

Docker挂载本地目录到容器路径时,本地目录会直接覆盖容器内对应路径的所有内容——你通过COPY命令打包进镜像的/var/www/html文件,会被挂载的本地.目录完全覆盖,所以看不到镜像里的原有文件。

解决方案

方案1:只挂载需要持久化的目录(推荐)

WordPress的核心文件(如wp-admin、wp-includes)不需要本地修改,真正需要持久化和本地编辑的只有wp-content(主题、插件、上传文件都在这里)。修改docker-compose.yml,只挂载wp-content:

version: "3.8"

services:
  ict:
    image: name_of_my_new_image
    volumes:
      - ./local-wp-content:/var/www/html/wp-content  # 仅挂载wp-content目录
    ports:
      - 80:80
    restart: always

这样既保留了镜像里的WordPress核心文件,又能本地管理主题、插件等内容,符合WordPress部署的最佳实践。

方案2:先同步镜像文件到本地(需挂载整个目录时用)

如果你必须挂载整个/var/www/html,可以先把镜像里的文件复制到本地目录,再启动容器:

  1. 执行以下命令,临时启动容器并同步文件到本地local-html目录:
docker run --rm -v $(pwd)/local-html:/tmp/html name_of_my_new_image sh -c "cp -a /var/www/html/. /tmp/html/"
  1. 修改docker-compose.yml的挂载路径:
volumes:
  - ./local-html:/var/www/html

启动容器后,本地目录已经包含镜像里的所有文件,挂载后不会再出现文件缺失的问题。

方案3:用Entrypoint脚本自动同步(动态场景)

如果需要每次启动容器时自动同步镜像文件到挂载目录(比如本地目录为空时自动填充),可以自定义Entrypoint脚本:

  1. 修改Dockerfile,把文件先复制到临时目录,并添加自定义脚本:
FROM wordpress:php7.4-apache
# 先将站点文件复制到临时目录
COPY ./site /var/www/html.orig
RUN chmod -R 777 /var/www/html.orig/wp-content
ENV PHP_OPCACHE_VALIDATE_TIMESTAMPS="0"

# 添加自定义Entrypoint脚本
COPY entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
CMD ["apache2-foreground"]
  1. 创建entrypoint.sh脚本:
#!/bin/bash

# 若挂载的目录为空,复制临时目录的内容到目标路径
if [ -z "$(ls -A /var/www/html)" ]; then
    cp -a /var/www/html.orig/. /var/www/html/
fi

# 执行原WordPress的启动命令
exec "$@"

启动容器时,脚本会自动检查挂载目录,为空则同步镜像里的文件,兼顾挂载需求和镜像内容保留。

内容的提问来源于stack exchange,提问作者Andriantseheno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:50:37