Docker Compose构建时ADD路径文件不存在报错解决方案
问题原因
Docker 构建镜像时,ADD/COPY 指令能访问的所有本地文件都被限制在你配置的 build context(构建上下文) 目录范围内,无法引用上下文目录外的任何文件,即使写宿主机绝对路径也无效。
你当前的配置有两个直接触发报错的问题:
- 你在docker-compose中为
dns_to_redis服务配置的构建上下文是./DNS_to_redis/(大写DNS开头),但你实际存放文件的目录是/home/new_prototypes/dns_to_redis(小写dns开头),Linux系统默认区分大小写,二者本身就不是同一个目录 - 你在Dockerfile的
ADD指令中写的源路径是home/new_prototypes/dns_to_redis/dns_redis.R,这是相对于构建上下文根目录的相对路径,不是宿主机的绝对路径,Docker会去./DNS_to_redis/home/new_prototypes/dns_to_redis/目录下找文件,自然找不到。
解决方法
选以下任意一种方案调整即可:
方案1(推荐,目录结构最清晰)
- 将宿主机上的
dns_redis.R文件移动到你配置的构建上下文目录./DNS_to_redis/下(建议先把这个目录名改成和实际一致的小写dns_to_redis,避免后续大小写踩坑) - 把docker-compose中的context路径同步修改为实际目录名:
dns_to_redis: build: context: ./dns_to_redis/ image: dns_to_redis depends_on: - redis environment: - REDIS_HOST=redis - REDIS_PORT=6379 networks: sensor: ipv4_address: 172.24.1.4
- 修改Dockerfile中的ADD指令,源路径直接写相对于构建上下文根目录的相对路径即可:
ADD dns_redis.R /home/
方案2(不需要移动现有文件)
如果不想调整现有文件存放位置,直接把构建上下文设置为dns_redis.R所在的目录即可:
- 确认你的docker-compose.yml存放位置,如果放在
/home/new_prototypes/目录下,就把build context修改为:
build: context: ./dns_to_redis/
- 同步修改Dockerfile中的ADD指令为:
ADD dns_redis.R /home/
额外排查点
如果调整后还是报错,检查两个点:
- 确认构建上下文目录下的
.dockerignore文件没有把dns_redis.R加入忽略列表 - 执行
docker-compose up的工作目录要正确,保证context配置的相对路径能正确匹配到目标目录
内容的提问来源于stack exchange,提问作者notmeagain
相关产品推荐
相关产品推荐

