Docker服务间文件链接问题求助:共享配置文件为空如何解决?
你的问题核心在于同时挂载单个文件和它的父目录到容器内的同一路径,Docker的挂载机制会导致宿主机侧的./conf/whoami.yml变成空文件。让我拆解原因并给出几个实用的解决方案:
为什么会出现空文件?
当你同时配置:
volumes: - "./whoami.yml:/etc/traefik/conf/whoami.yml" - "./conf:/etc/traefik/conf"
Docker会先处理目录挂载./conf:/etc/traefik/conf,此时容器内的/etc/traefik/conf完全映射到宿主机的./conf目录。随后你试图挂载单个文件到这个目录下,但如果宿主机./conf里原本没有whoami.yml,Docker会在容器内的/etc/traefik/conf下创建一个空文件,这个空文件会反向同步到宿主机的./conf目录,最终导致你看到的空文件。
解决方案1:调整文件结构(最简洁)
把宿主机的./whoami.yml直接移动到./conf目录下,然后只保留目录挂载:
whoami: image: "containous/whoami" networks: - traefik volumes: - "./conf:/etc/traefik/conf"
这样Traefik和whoami服务都能通过挂载的./conf目录访问whoami.yml,无需手动复制,后续修改./conf/whoami.yml会自动同步到容器内。
解决方案2:使用共享命名卷(适合多服务共享配置)
创建一个Docker命名卷来共享配置文件,避免宿主机目录挂载的冲突:
services: traefik: # 你的Traefik配置 volumes: - traefik-conf:/etc/traefik/conf # 其他Traefik挂载项... whoami: image: "containous/whoami" networks: - traefik volumes: - traefik-conf:/etc/traefik/conf volumes: traefik-conf:
初始化卷内容
首次使用时,需要把你的whoami.yml复制到命名卷里:
docker run --rm -v $(pwd)/whoami.yml:/tmp/whoami.yml -v traefik-conf:/etc/traefik/conf busybox cp /tmp/whoami.yml /etc/traefik/conf/
之后两个服务都能访问卷里的配置文件,修改卷内文件会同步到所有挂载该卷的服务。
解决方案3:启动时自动复制文件(保留原有文件结构)
如果你不想调整宿主机的文件结构,可以在whoami服务启动时自动把./whoami.yml复制到./conf目录:
whoami: image: "containous/whoami" networks: - traefik volumes: - "./whoami.yml:/tmp/whoami.yml" - "./conf:/etc/traefik/conf" command: sh -c "cp /tmp/whoami.yml /etc/traefik/conf/whoami.yml && /whoami"
这里通过command覆盖了默认启动命令,先执行复制操作,再启动whoami服务。每次启停服务时,都会自动同步最新的./whoami.yml到./conf目录,Traefik就能读取到最新配置。
内容的提问来源于stack exchange,提问作者Artentica

