ADD 指令 的详细解析

news/2025/2/11 9:56:39/文章来源:https://www.cnblogs.com/autopwn/p/18709181

以下是关于 ADD 指令 的详细解析,包括其功能、语法、与 COPY 的区别、使用场景,以及一个完整的示例说明。


ADD 指令概述

  • 作用

    • ADD 指令用于将文件或目录从 Docker 构建上下文复制到容器镜像中。
    • COPY 类似,但功能更强大,支持自动解压和远程下载。
  • 功能特点

    1. 支持自动解压
      • 当源文件是 .tar.gzip.bzip2.xz 压缩文件时,ADD 会自动解压内容到目标目录。
    2. 支持远程下载
      • 可以通过 URL 从远程下载文件到容器镜像中。
    3. 文件复制
      • COPY 一样,可以将本地文件或目录复制到目标路径。

ADD 的语法

基本语法

ADD [选项] <源路径> <目标路径>
  • 源路径(src)
    • 本地文件或目录,也可以是远程 URL。
    • 如果是压缩文件,ADD 会自动解压。
  • 目标路径(dest)
    • 容器内的目标路径。
    • 如果路径不存在,Docker 会自动创建。

支持选项

  • --chown=<user>:<group>
    • 用于设置目标文件的所有者和所属组。
    • 示例:
      ADD --chown=nginx:nginx file.tar.gz /app/
      

ADD 与 COPY 的区别

特性 ADD COPY
功能性 支持自动解压和远程下载 仅用于本地文件或目录复制
自动解压 会自动解压 .tar.gzip 等压缩文件 不支持自动解压
远程下载 可以从 URL 下载文件到容器中 不支持 URL 下载
推荐使用场景 需要解压或下载远程文件时 只需复制本地静态文件或目录时
复杂性 功能复杂,可能导致构建缓存失效 简单高效

ADD 的实际应用场景

1. 自动解压文件

当需要将 .tar.gz 压缩包解压到容器时:

FROM ubuntu# 自动将 file.tar.gz 解压并复制到容器的 /app 目录中
ADD file.tar.gz /app/

行为

  • 如果 file.tar.gz 是一个压缩包(如 tar 格式),ADD 会自动解压,并将解压后的内容存放到 /app/ 目录中。

2. 从 URL 下载文件

当需要直接下载远程文件到容器时:

FROM ubuntu# 从远程 URL 下载文件并存储到容器的 /tmp/ 目录
ADD https://example.com/app.tar.gz /tmp/

行为

  • ADD 会从指定的 URL 下载 app.tar.gz 文件到容器的 /tmp/ 目录,但不会自动解压。

3. 普通文件复制(与 COPY 类似)

将本地文件复制到容器中:

FROM ubuntu# 将本地文件添加到 /usr/local/bin 中
ADD myscript.sh /usr/local/bin/

行为

  • COPY 的效果类似,将 myscript.sh 文件复制到容器的 /usr/local/bin/ 中。

ADD 的优缺点

优点

  1. 解压能力
    • 能够自动解压压缩文件(如 .tar.gz.zip)。
  2. 远程下载
    • 可以从 URL 下载文件,无需额外的工具或步骤。

缺点

  1. 构建缓存失效
    • 如果 ADD 的源文件是一个 URL,每次构建都会重新下载,无法利用 Docker 的缓存机制。
  2. 复杂性增加
    • 可能会引入一些隐式行为,不如 COPY 简单直观。

推荐使用 COPY 而非 ADD 的原因

  • 稳定性COPY 功能单一,更加稳定和可预测。
  • 透明性ADD 的自动解压和远程下载可能导致意外行为。

ADD 的实际案例

案例 1:自动解压压缩文件

FROM ubuntu# 自动解压 file.tar.gz 到 /app 目录中
ADD file.tar.gz /app/# 设置工作目录
WORKDIR /app# 安装解压后的文件内容
RUN ./install.sh

解释

  • ADD file.tar.gz /app/ 会将 file.tar.gz 解压,并将解压后的内容存放到 /app/
  • 假设解压后的内容包含一个 install.sh 脚本,容器会在 /app 下运行该脚本。

案例 2:下载远程文件

FROM ubuntu# 从远程 URL 下载文件到容器的 /tmp/ 目录
ADD https://example.com/app.zip /tmp/# 手动解压文件
RUN unzip /tmp/app.zip -d /app/

解释

  • ADD 会从 URL 下载文件。
  • 如果需要解压 .zip 文件,可以通过 RUN 指令手动解压。

案例 3:与解压配合使用

FROM ubuntu# 自动解压文件并复制内容到容器
ADD data.tar.gz /data/# 设置解压后的目录为工作目录
WORKDIR /data# 运行解压后的应用程序
CMD ["./app"]

解释

  • 将压缩包 data.tar.gz 解压到 /data/ 目录中。
  • 设置容器的工作目录为 /data,并运行解压后的应用程序 app

ADD 和 COPY 的选择

需求 指令选择
普通文件或目录的复制 COPY
自动解压压缩文件 ADD
从远程 URL 下载文件 ADD
稳定性和可预测性要求较高 COPY

完整的示例:基于 ADD 构建镜像

目标

  • 构建一个 Nginx 镜像,并替换默认首页。
  • 使用 ADD 将压缩文件解压到指定目录。

Dockerfile

FROM nginx# 自动解压文件并替换 Nginx 默认首页
ADD static-files.tar.gz /usr/share/nginx/html/# 暴露端口
EXPOSE 80# 启动 Nginx 服务
CMD ["nginx", "-g", "daemon off;"]

目录结构

.
├── static-files.tar.gz
├── Dockerfile

构建和运行

  1. 构建镜像
    docker build -t custom-nginx .
    
  2. 运行容器
    docker run -d -p 8080:80 custom-nginx
    
  3. 测试结果
    • 访问浏览器 http://localhost:8080,可以看到替换后的首页内容。

总结

  1. ADD 的核心能力

    • 自动解压功能。
    • 从 URL 下载文件。
  2. 选择标准

    • 如果只是简单的文件复制,优先选择 COPY
    • 如果需要解压或远程下载文件,选择 ADD
  3. 使用建议

    • 在 Dockerfile 中明确使用 ADD 的特殊功能,而非简单的文件复制。
    • 避免混用,确保镜像构建行为的可控性和一致性。

通过合理选择 ADD 和 COPY,可以提高镜像构建效率,同时保证行为的明确性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/881984.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『玩转Streamlit』--会话状态管理

在Web应用开发中,会话管理是一个至关重要的概念,它能够帮助开发者追踪用户在应用中的行为和状态,从而为用户提供更加个性化、连贯且高效的交互体验。 Streamlit作为一个简单而强大的用于快速构建和部署数据科学和机器学习项目,也提供了强大的会话状态管理功能,即st.sessio…

深度学习四大名著-蜥蜴书-《机器学习实战:基于Scikit-Learn、Keras和TensorFlow 原书第3版 中文版+英文版》PDF、EPUB免费下载

深度学习四大名著全新升级版,为机器学习落地实践提供翔实指导,Keras之父鼎力推荐。 这本机器学习畅销书基于TensorFlow 2和Scikit-Learn的新版本进行了全面更新,通过具体的示例、非常少的理论和可用于生产环境的Python框架,从零帮助你直观地理解并掌握构建智能系统所需要的…

看板软件在酒店行业:从任务分配到跨部门协作的全面升级

酒店行业通过使用看板软件进行项目管理,可以实现任务的可视化管理、提高跨部门协作效率、优化工作流程以及持续监控与优化项目进展。这有助于酒店提升运营效率、服务质量以及客户满意度。酒店行业使用看板软件进行项目管理,可以有效提升运营效率和服务质量。以下是如何在酒店…

DevOps和它的朋友们——聊聊其他 “Ops”(一)

DevOps不仅仅是将敏捷开发概念与IT运维相结合,还简化了在云环境中开发和部署应用程序的过程,从而使开发生命周期大大缩短。大家好,我是陈哥,今天想和大家聊聊DevOps与其他“Ops”。 DevOps不仅仅是将敏捷开发概念与IT运维相结合,还简化了在云环境中开发和部署应用程序的过…

进程权限 - 降低子进程权限(windows)

在 Windows 系统中,管理员权限和非管理员权限运行的程序之间不能使用 Windows 提供的通信机制进行通信。对于部分文件夹(ProgramData),管理员权限创建的文件是不能以非管理员权限修改和删除的。 然而,一个进程运行之后启动的子进程,会继承当前进程的 UAC 权限;于是有时我…

java安全中的类加载

java安全中的类加载本文所涉及的内容仅供参考与教育目的,旨在普及网络安全相关知识。其内容不代表任何机构、组织或个人的权威建议,亦不构成具体的操作指南或法律依据。作者及发布平台对因使用本文信息直接或间接引发的任何风险、损失或法律纠纷不承担责任。对应的代码我发在…

cvat nuclio serverless pip install安装失败

cvat nuclio serverless 安装自动标注插件失败./serverless/deploy_cpu.sh serverless/onnx/WongKinYiu/yolov7主要pip安装失败的原因是部分依赖包不能够在大陆下载 只需要将function.yaml内的脚本添加依赖加速即可-i https://pypi.tuna.tsinghua.edu.cn/simple

Qt写Word文档-Windows

电脑没有安装微软的office,安装的是wps,用的是 QAxObject,所以只支持Windows系统一、pro文件添加 axcontainer 二、实现代码#include <QAxObject> #include <QDebug> // 创建Word应用程序对象 QAxObject* word = new QAxObject("kwps.Application");…

绝了,一招解决DeepSeek 提示“服务器繁忙,请稍后再试” 卡顿问题!(保姆级教程)

大家好,我是狂师。 现在 AI 圈里讨论最多的话题就是:"国产之光DeepSeek了"。 但用过的人也知道,是真的卡。动不动就提示:“服务器繁忙,请稍后再试”用官方App或网页版,估计10条回复中至少有8条会卡爆。对于重度使用的我来讲,经常会被官网的卡顿搞得差点吐血。…

揭秘 Sdcb Chats 如何解析 DeepSeek-R1 思维链

在上一篇文章中,我介绍了 Sdcb Chats 如何集成 DeepSeek-R1 模型,并利用其思维链(Chain of Thought, CoT)功能增强 AI 推理的透明度。DeepSeek-R1 强大的思维链能力给用户留下了深刻印象。本文将深入剖析 Sdcb Chats 实现这一功能的技术细节,重点介绍如何基于 OpenAI .NET…

全网最全的DeepSeek的使用指导资源,拿去用来操作其他的大模型也一样有用,你去找付费培训不如打赏我一毛

最近全网都在为火热的DeepSeek疯狂,不少商家培训都是出了付费培训,不少人都上当受骗。我就搜刮全网最全的使用,供大家使用,有使用文档,有提示词培训,有视频,应有尽有,现在我们就开始吧! 一、如何使用提示词 DeepSeek官网提供了很全面的提示词规则手册,包含了13个方向…

0帧起手将腾讯混元大模型集成到Spring AI的全过程解析

在前面,我们已经为大家铺垫了大量的知识点,并深入解析了Spring AI项目的相关内容。今天,我们将正式进入实战环节,从零开始,小雨将带领大家一步步完成将第三方大模型集成到Spring AI中的全过程。为了方便讲解,本次实战的示范将以腾讯的混元大模型为主,我们将逐步向你展示…