如何通过Dockerfile的ADD指令实现远程文件安全下载

夏雪酱_8559

夏雪酱_8559

2026-04-28

151人浏览

原创

不能通过ADD指令实现远程文件安全下载。自Docker 17.05+起,ADD对远程URL的支持已被完全移除,构建会报错“ADD does not support remote URLs”,因其违背可重现性、缓存可控性与内容可审计性;正确做法是用RUN + curl/wget配合哈希校验、临时文件清理及多阶段构建等显式安全控制。

如何通过dockerfile的add指令实现远程文件安全下载

不能通过 ADD 指令实现远程文件安全下载。

自 Docker 17.05+ 起,ADD 对远程 URL(如 https://...)的支持已被完全移除。尝试使用类似 ADD https://example.com/file.zip /app/ 的写法,构建时会直接报错:

ADD does not support remote URLs

这不是配置问题或版本兼容问题,而是 Docker 官方主动禁用该行为——因为 ADD 下载远程资源天生违背构建可重现性、缓存可控性和内容可审计性三大原则。

所以,“用 ADD 实现安全下载”在技术上已不可行,在工程实践上也不被推荐。

Docker Compose Optimizer
Docker Compose Optimizer

优化 Docker Compose 配置,适用于开发和生产环境——审计服务、网络、卷、健康检查和资源管理。

下载

✅ 正确做法:用 RUN + curl/wget 替代,并嵌入安全控制

1. 基础安全下载(含校验与清理)

RUN curl -fsSL -o /tmp/app.tar.gz https://example.com/app-v2.1.0.tar.gz && \
    echo "sha256:abc123... /tmp/app.tar.gz" | sha256sum -c - && \
    tar -xzf /tmp/app.tar.gz -C /app && \
    rm -f /tmp/app.tar.gz
  • -fsSL:静默失败、跟随重定向、忽略证书警告(生产环境建议加 --cacert 指定可信 CA)
  • sha256sum -c -:立即校验哈希,失败则整层构建中断
  • rm -f:避免临时文件污染镜像体积

2. 敏感资源下载(如带 token 的内网制品)

禁用明文 URL,改用 BuildKit secret:

# 启用 BuildKit 构建:DOCKER_BUILDKIT=1 docker build .
RUN --mount=type=secret,id=mytoken \
    curl -H "Authorization: Bearer $(cat /run/secrets/mytoken)" \
         -fsSL https://internal.example.com/secret.bin > /tmp/secret.bin && \
    chmod +x /tmp/secret.bin && \
    mv /tmp/secret.bin /usr/local/bin/secret-tool
  • 凭据仅在当前 RUN 中存在,不会写入任何镜像层
  • 需配合 --secret id=mytoken,src=./.token 构建参数传入

3. 多阶段构建:隔离构建依赖,精简运行镜像

FROM alpine:latest AS builder
RUN apk add --no-cache curl ca-certificates && \
    curl -fsSL https://github.com/user/tool/releases/download/v1.0/tool-linux-amd64 -o /tmp/tool && \
    echo "sha256:9f8a... /tmp/tool" | sha256sum -c - && \
    chmod +x /tmp/tool && \
    mv /tmp/tool /usr/local/bin/tool

FROM alpine:latest
COPY --from=builder /usr/local/bin/tool /usr/local/bin/tool
  • 下载、校验、权限设置全在 builder 阶段完成
  • 最终镜像不含 curl、证书包、临时文件,更小更安全

❌ 常见错误写法(请避免)

  • ADD https://... /app/ → 构建失败(Docker ≥17.05)
  • ADD http://insecure.example.com/file.sh /app/ → 不支持 HTTP,且无 TLS 校验
  • ADD https://user:pass@host/file.zip /app/ → 凭据硬编码进镜像历史,严重泄露风险
  • RUN curl ... && chmod +x ... 但不 rm 临时文件 → 镜像体积膨胀,残留敏感路径

? 安全增强建议

  • 所有远程二进制优先走企业私有制品库(如 Harbor、Nexus),而非直连公网 URL
  • 生产环境哈希值建议通过 --build-arg SHA256_SUM=... 注入,避免硬编码在 Dockerfile 中
  • 解压前检查 tar 包路径是否含 ../(防路径遍历):
    tar -t -f /tmp/app.tar.gz | grep '^\.\./' && exit 1 || true

本质上,安全不是靠某个指令“自动完成”,而是靠显式步骤设计出来的。ADD 的隐式行为恰恰是安全隐患的温床;而 RUN + 工具链 + 显式验证,才是可控、可审计、可落地的安全实践。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

docker

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

2023.07.24

765

4

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

6059

6

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

7137

6

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

2813

7

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

2026.02.11

319

16

Docker 容器部署
Docker 容器部署

本专题整合了Docker容器部署相关内容,阅读专题下面的文章了解更多详细操作教程。

2026.03.31

471

14

Java容器化部署与Docker实践教程合集
Java容器化部署与Docker实践教程合集

聚焦 Java 应用的容器化与云原生部署,讲解 Dockerfile 编写规范与 Java 应用镜像构建、多阶段构建(Multi-stage Build)减小镜像体积、Jib / Buildpacks 免 Dockerfile 镜像构建方案、JVM 容器感知参数(-XX:MaxRAMPercentage)配置、Docker Compose 编排多服务(应用 + MySQL + Redis)、容器健康检查与资源限制、Kubernetes

2026.05.11

440

26

Go Docker与容器化部署教程合集
Go Docker与容器化部署教程合集

聚焦 Go 应用的容器化部署优势与实践,讲解 Go 静态编译特性(CGO_ENABLED=0)与 scratch / distroless 极小基础镜像构建、多阶段 Dockerfile 编写规范、交叉编译生成目标平台二进制、镜像安全扫描(Trivy)与漏洞修复、Docker Compose 本地编排开发环境、Kubernetes Deployment / Service / ConfigMap 部署 Go 服务、健康检查(Livene

2026.05.15

325

24

Hyperf 项目部署运维与性能调优手册
Hyperf 项目部署运维与性能调优手册

聚焦 Hyperf 在生产环境的落地,包含 Docker 高效打包、Swoole 配置优化、常见的内存溢出(OOM)问题排查方法以及热更新方案。

2026.05.19

505

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpMyAdmin 安装文档
phpMyAdmin 安装文档

共0课时 | 0人学习

Docker 官方文档
Docker 官方文档

共0课时 | 0人学习

宝塔 Docker 模块使用手册
宝塔 Docker 模块使用手册

共0课时 | 0人学习