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,可以先把镜像里的文件复制到本地目录,再启动容器:
- 执行以下命令,临时启动容器并同步文件到本地
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/"
- 修改
docker-compose.yml的挂载路径:
volumes: - ./local-html:/var/www/html
启动容器后,本地目录已经包含镜像里的所有文件,挂载后不会再出现文件缺失的问题。
方案3:用Entrypoint脚本自动同步(动态场景)
如果需要每次启动容器时自动同步镜像文件到挂载目录(比如本地目录为空时自动填充),可以自定义Entrypoint脚本:
- 修改
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"]
- 创建
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
相关产品推荐
相关产品推荐

