如何将主机目录全量内容复制到Docker容器 支持docker-compose自动执行
实现目录全内容(保留子结构)复制到Docker容器的方案
单次手动复制命令
直接执行以下命令即可,无需挂载、无需修改镜像,纯复制操作:docker cp ./src/. <替换为你的容器名/容器ID>:/var/www/html/
关键注意点:源路径末尾的
/.是核心,若省略直接写./src,会把整个src文件夹本身复制到目标路径下,最终变成/var/www/html/src;加上/.才代表复制src目录下的所有内容(包含文件、任意层级子目录),复制过程会自动保留原有目录结构,同名文件会被覆盖,目标路径下的非冲突文件不会被删除。
docker-compose up 启动自动复制配置
如果需要每次执行docker-compose up -d启动容器时自动完成复制,可通过临时挂载+启动入口执行复制逻辑实现,全程是纯复制效果,不会把业务目录做常驻绑定挂载:
直接参考修改你的docker-compose.yml:
version: '3.8' services: your-service-name: # 替换为你实际使用的镜像,比如nginx:alpine、php:apache等 image: nginx:alpine volumes: # 只读临时挂载本地src目录,仅用于启动时读取内容做复制,不是业务挂载 - ./src:/tmp/src-init:ro # 启动时先执行复制,再运行镜像原有默认启动命令 entrypoint: sh -c "cp -r /tmp/src-init/. /var/www/html/ && exec /docker-entrypoint.sh nginx -g 'daemon off;'"
配置说明:
- 临时挂载仅用于容器启动瞬间读取主机src目录内容,复制完成后容器内
/var/www/html是容器内部独立文件系统的内容,后续修改主机src文件不会同步影响容器内运行的文件,完全符合纯复制要求 - 命令末尾的
exec /docker-entrypoint.sh nginx -g 'daemon off;'需要替换为你所用镜像的默认入口启动命令,避免破坏镜像原有启动逻辑:例如使用php:apache镜像时,替换为exec docker-php-entrypoint apache2-foreground即可 - 如果目标目录存在权限问题,可在cp命令前增加权限调整逻辑,例如针对php环境可加
chown -R www-data:www-data /var/www/html
如果不需要每次启动同步主机最新的src内容,只是要把src内容固定打包到镜像里,直接编写Dockerfile在构建阶段复制是更简单的方案:
# 基于你使用的基础镜像 FROM nginx:alpine # 复制src下所有内容到目标目录,自动保留子目录结构 COPY ./src/. /var/www/html/
之后在docker-compose.yml里配置build路径指向该Dockerfile即可,构建出的镜像会自带所有src内容,启动无需额外复制操作。
内容的提问来源于stack exchange,提问作者Tomas Baranauskas
相关产品推荐
相关产品推荐

