Docker Compose中能否为自定义卷挂载指定子路径?
Docker Compose中能否为自定义卷挂载指定子路径?
这个问题我碰到过不少次,其实核心是Docker卷挂载的逻辑限制——咱们先理清楚问题所在,再给你两种可行的解决办法:
首先明确一点:你不能直接用卷名/子路径:容器路径这种语法来挂载自定义卷的子路径。Docker的卷挂载规则里,冒号左边要么是完整的主机路径,要么是已定义的卷名,它不会把root_volume/dockerfiles/nginx/default.conf识别为现有卷的子路径,反而会把这一串当成一个新的卷名来创建,自然达不到你想要的效果。
针对你的场景,有两种实用的解决方案:
方案一:直接使用主机路径绑定挂载
既然你的root_volume本质是绑定到主机/home/user/test目录的本地卷,那后面两个文件挂载可以直接跳过卷,用主机绝对路径来写,和卷的底层路径保持一致:
nginx: image: nginx:stable-alpine container_name: test_nginx restart: unless-stopped tty: true ports: - "8015:80" networks: - test_network volumes: - root_volume:/var/www/html - /home/user/test/dockerfiles/nginx/default.conf:/etc/nginx/conf.d/default.conf - /home/user/test/dockerfiles/nginx/nginx.conf:/etc/nginx/nginx.conf
这种方式最直接,不需要改卷的定义,就能精准挂载单个文件。
方案二:拆分自定义卷,为子路径单独定义卷
如果你坚持要通过卷的方式实现,可以给需要挂载的子目录单独定义卷,比如:
volumes: root_volume: driver: local driver_opts: device: "/home/user/test" type: none nginx_configs: driver: local driver_opts: device: "/home/user/test/dockerfiles/nginx" type: none
然后在nginx服务里挂载这些卷:
nginx: # 其他配置不变... volumes: - root_volume:/var/www/html - nginx_configs/default.conf:/etc/nginx/conf.d/default.conf - nginx_configs/nginx.conf:/etc/nginx/nginx.conf
不过要注意:如果容器里的目标目录原本有默认文件,挂载单个文件会覆盖掉容器内的原文件;如果挂载整个目录,会替换掉容器内的整个目录内容,根据你的需求调整即可。
备注:内容来源于stack exchange,提问作者M a m a D
相关产品推荐
相关产品推荐

