同一Dockerfile创建的两个Docker Compose服务是否共享文件目录?
关于Docker Compose多服务文件共享的问题解答
结论先行:不行。哪怕两个服务用同一个Dockerfile构建镜像,启动后的容器也是完全独立的实例,各自拥有独立的文件系统——服务A下载的random.txt只会存在于A容器的文件系统里,服务B根本访问不到。
核心原因
- Docker容器的核心特性就是隔离性,每个容器都是独立的进程环境,拥有专属的文件系统层。基于同一个镜像启动的容器,共享的只是镜像的只读层,但运行时的任何修改(比如下载文件、生成日志)都会写入容器自己的可写层,这个层完全属于当前容器,和其他容器无关。
- 简单说:镜像只是模板,每个服务启动时都会基于模板创建全新的“副本”,副本之间互不干扰。
你之前用共享卷的方式是对的,还能优化
如果觉得手动配置同路径卷麻烦,可以用Docker Compose的命名卷,只需要定义一次,两个服务都挂载它就行,配置更简洁:
# 定义共享命名卷 volumes: shared-file-storage: services: service-a: build: . volumes: - shared-file-storage:/app/downloads command: ["sh", "-c", "curl -o /app/downloads/random.txt https://example.com/random.txt"] service-b: build: . volumes: - shared-file-storage:/app/files command: ["sh", "-c", "cat /app/files/random.txt"]
额外提醒
不要混淆“镜像层共享”和“容器运行时文件共享”:镜像层是只读的,所有基于该镜像的容器都会共享这部分,但容器启动后的任何文件修改都是私有的,除非通过卷挂载到外部或者共享卷,否则其他容器拿不到。
内容的提问来源于stack exchange,提问作者edd1
相关产品推荐
相关产品推荐

