Docker Compose中如何在命名卷内映射指定文件?
问题原因与解决方案
问题原因
你遇到的错误是因为Docker命名卷不支持指定卷内的子路径(比如evcc-config/evcc.yaml这种写法),命名卷只能以卷名:容器路径的形式挂载整个卷到容器的某个目录,无法直接映射卷内的单个文件或子目录到容器的特定路径。
可行解决方案
方案1:主机挂载NFS后用Bind映射(推荐)
这种方式最直接,先把NAS的NFS共享挂载到Docker主机的本地目录,再通过Bind挂载直接映射单个文件和目录到容器:
- 在Docker主机上创建NFS挂载点
sudo mkdir -p /mnt/evcc-config
- 手动挂载NFS共享
sudo mount -t nfs 192.168.0.60:/volume2/apps/config/evcc /mnt/evcc-config
- 设置开机自动挂载(可选但推荐)
编辑/etc/fstab文件,添加以下内容:
192.168.0.60:/volume2/apps/config/evcc /mnt/evcc-config nfs nolock,rw,soft 0 0
执行sudo mount -a验证配置生效。
- 修改Docker Compose配置
将volumes部分替换为Bind挂载:
version: "3.9" services: evcc: command: - evcc image: evcc/evcc:latest ports: - 7070:7070/tcp - 8887:8887/tcp - 7090:7090/udp - 9522:9522/udp volumes: # Bind挂载单个配置文件 - /mnt/evcc-config/evcc.yaml:/etc/evcc.yaml # Bind挂载数据目录 - /mnt/evcc-config/.evcc:/root/.evcc labels: - "traefik.enable=true" - "traefik.http.routers.evcc.rule=Host(`evcc.mydomain.com`)" - "traefik.http.routers.evcc.entrypoints=websecure" - "traefik.http.routers.evcc.tls.certresolver=myresolver" - "traefik.http.services.evcc.loadbalancer.server.port=7070"
方案2:创建独立的NFS命名卷(适用于需分开管理的场景)
如果需要将配置文件和数据目录分别放在NAS的不同NFS共享中,可以创建两个独立的命名卷:
version: "3.9" services: evcc: command: - evcc image: evcc/evcc:latest ports: - 7070:7070/tcp - 8887:8887/tcp - 7090:7090/udp - 9522:9522/udp volumes: # 挂载配置文件卷到容器的/etc目录(需确保卷内只有evcc.yaml) - evcc-yaml:/etc # 挂载数据目录卷到容器的/root/.evcc - evcc-data:/root/.evcc labels: - "traefik.enable=true" - "traefik.http.routers.evcc.rule=Host(`evcc.mydomain.com`)" - "traefik.http.routers.evcc.entrypoints=websecure" - "traefik.http.routers.evcc.tls.certresolver=myresolver" - "traefik.http.services.evcc.loadbalancer.server.port=7070" volumes: # 对应NAS上存放evcc.yaml的共享目录 evcc-yaml: driver_opts: type: "nfs" o: "addr=192.168.0.60,nolock,rw,soft" device: ":/volume2/apps/config/evcc/yaml" # 对应NAS上存放.evcc数据的共享目录 evcc-data: driver_opts: type: "nfs" o: "addr=192.168.0.60,nolock,rw,soft" device: ":/volume2/apps/config/evcc/data"
注意:此方案要求NAS上的/volume2/apps/config/evcc/yaml共享目录中仅存放evcc.yaml,否则会覆盖容器的/etc目录下其他文件,不符合你的需求,因此更推荐方案1。
内容的提问来源于stack exchange,提问作者J4N
相关产品推荐
相关产品推荐

