Dockerfile的ADD指令实现远程文件的安全校验下载

 更新时间:2026年04月27日 08:50:18   作者:舞夢輝影  
本文主要介绍了Dockerfile的ADD指令实现远程文件的安全校验下载,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

因为自 Docker 17.05+ 起,ADD 对远程 URL 的支持已被彻底移除。任何形如 ADD https://example.com/file.tar.gz /app/ 的写法都会在构建时直接报错:

ADD does not support remote URLs

这不是配置问题,而是 Docker 官方为保障构建可重现性、缓存一致性与安全性所作的强制限制。

所以,“用 ADD 实现安全校验下载”这一前提本身不成立——ADD 既无法下载,也不提供校验能力(无哈希验证、无签名检查、无证书校验、无权限控制)。

真正可行且推荐的做法是:放弃 ADD 下载,改用 RUN + curl/wget 显式下载 + 校验 + 清理

✅ 安全校验下载的正确写法(推荐)

使用 curl 下载并校验 SHA256

RUN set -eux; \
    curl -fsSL "https://example.com/app-v2.1.0.tar.gz" -o /tmp/app.tar.gz; \
    echo "a1b2c3d4...  /tmp/app.tar.gz" | sha256sum -c -; \
    tar -xzf /tmp/app.tar.gz -C /usr/local/; \
    rm -f /tmp/app.tar.gz
  • set -eux:任一命令失败即中断,避免错误静默继续
  • curl -fsSL:静默失败、跟随重定向、启用 SSL
  • sha256sum -c -:从标准输入读取校验行并验证
  • rm -f:立即清理临时文件,不增大镜像体积

需要 PGP 签名验证时(更高安全等级)

RUN set -eux; \
    curl -fsSL "https://example.com/app.tar.gz" -o /tmp/app.tar.gz; \
    curl -fsSL "https://example.com/app.tar.gz.asc" -o /tmp/app.tar.gz.asc; \
    gpg --no-default-keyring --keyring /tmp/pubring.gpg --import trusted-key.pub; \
    gpg --no-default-keyring --keyring /tmp/pubring.gpg --verify /tmp/app.tar.gz.asc /tmp/app.tar.gz; \
    tar -xzf /tmp/app.tar.gz -C /app/; \
    rm -f /tmp/app.tar.gz /tmp/app.tar.gz.asc /tmp/pubring.gpg

⚠️ 注意:需提前将可信公钥(trusted-key.pub)放入构建上下文,或通过 BuildKit --secret 安全挂载。

✅ 更安全的进阶实践

多阶段构建:隔离下载与运行环境

# 构建阶段:下载、校验、解压、安装
FROM alpine:latest AS builder
RUN apk add --no-cache curl gnupg tar && \
    curl -fsSL https://example.com/binary -o /tmp/tool && \
    echo "d4e5f6... /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
CMD ["tool"]

敏感资源(含 token、私有地址)必须用 BuildKit secret

# 启用方式:DOCKER_BUILDKIT=1 docker build --secret id=mytoken,src=./token.txt .
RUN --mount=type=secret,id=mytoken \
    curl -H "Authorization: Bearer $(cat /run/secrets/mytoken)" \
         -fsSL https://internal.example.com/secret.bin > /tmp/secret.bin
  • 凭据仅在当前 RUN 中可见,不会写入镜像层
  • 不暴露于 docker history 或镜像文件系统

❌ 常见错误写法(务必避免)

  • ADD https://... /app/ → 构建直接失败(Docker ≥17.05)
  • COPY url /dest → COPY 本就不支持 URL,语法错误
  • RUN curl ... && ADD /tmp/file /dest → 多余,ADD 此时退化为 COPY,无意义
  • RUN curl -O https://... && sha256sum ... 但不加 set -eux 或 rm → 错误被忽略、临时文件残留

不复杂但容易忽略:安全不是靠指令“自动完成”,而是靠你显式控制每一步——下载、校验、权限、清理、隔离。ADD 的远程功能早已退出历史舞台,现在该用更透明、更可控的方式构建可信镜像。

到此这篇关于Dockerfile的ADD指令实现远程文件的安全校验下载的文章就介绍到这了,更多相关Dockerfile 远程文件安全校验下载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java虚拟机使用jvisualvm工具远程监控tomcat内存

    Java虚拟机使用jvisualvm工具远程监控tomcat内存

    这篇文章主要介绍了Java虚拟机使用jvisualvm工具远程监控tomcat内存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • spring boot springMVC扩展配置实现解析

    spring boot springMVC扩展配置实现解析

    这篇文章主要介绍了spring boot springMVC扩展配置实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Java用自定义的类作为HashMap的key值实例

    Java用自定义的类作为HashMap的key值实例

    下面小编就为大家带来一篇Java用自定义的类作为HashMap的key值实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • 详解Java POI excel自定义设置单元格格式

    详解Java POI excel自定义设置单元格格式

    这篇文章主要介绍了Java POI excel设置单元格格式,自定义设置,设置单元格格式:来源_formats,更多数据类型从formats里面发现,需要的朋友可以参考下
    2024-01-01
  • java 压缩图片(只缩小体积,不更改图片尺寸)的示例

    java 压缩图片(只缩小体积,不更改图片尺寸)的示例

    这篇文章主要介绍了java 如何压缩图片体积,帮助大家更好的利用Java处理图片,应对特殊情况,感兴趣的朋友可以了解下
    2020-10-10
  • Java 中 String、StringBuffer、StringBuilder 的区别

    Java 中 String、StringBuffer、StringBuilder 的区别

    本文主要介绍了Java 中 String、StringBuffer、StringBuilder 的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-05-05
  • spring5新特性全面介绍

    spring5新特性全面介绍

    本文将全面介绍 Spring 5。我将介绍 Java SE 8 和 Java EE 7 API 的基准升级、Spring 5 的新反应式编程模型、HTTP/2 支持,以及 Spring 通过 Kotlin 对函数式编程的全面支持。
    2020-10-10
  • SpringBoot实现接受文件和对象

    SpringBoot实现接受文件和对象

    SpringBoot中接受文件和对象的场景,推荐使用`multipart/form-data`格式,后端可以通过接受实体并将文件放入对象属性中来处理数据,使用`@Validated`注解进行参数校验是可行的,但要注意不要与`@RequestBody`注解同时使用
    2025-12-12
  • Spring Boot使用模板引擎JSP实例解析

    Spring Boot使用模板引擎JSP实例解析

    这篇文章主要介绍了Spring Boot使用模板引擎JSP实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java编程之内置观察者模式实例详解

    Java编程之内置观察者模式实例详解

    这篇文章主要介绍了Java编程之内置观察者模式,结合实例形式较为详细的分析了java内置观察者模式的原理、实现方法及相关注意事项,需要的朋友可以参考下
    2017-08-08

最新评论