Dockerfile Add和Copy的区别。

devtools/2025/3/17 0:57:04/

Dockerfile 中,ADDCOPY 都用于将文件或目录从构建上下文(通常是 Dockerfile 所在的目录)复制到 Docker 镜像中,但它们有一些关键区别:


1. COPY 指令

COPY 主要用于复制本地文件或目录到容器的指定路径。

📌 语法

COPY <源路径> <目标路径>

📌 特性

仅支持复制本地文件或目录(不能从远程 URL 复制)。
不会自动解压 .tar 压缩包(需要手动 RUN tar -xvf)。
适用于简单的文件复制操作

📌 示例

COPY index.html /usr/share/nginx/html/
  • 这会将 index.html 文件复制到 /usr/share/nginx/html/ 目录下。
COPY src/ /app/
  • 这会将 src/ 目录的所有内容复制到 /app/ 目录下。

2. ADD 指令

ADDCOPY 更强大,除了能复制文件,它还能处理远程 URL 下载自动解压 .tar 压缩包

📌 语法

ADD <源路径> <目标路径>

📌 特性

可以复制本地文件和目录(与 COPY 相同)。
支持远程 URL 下载COPY 不支持)。
自动解压 .tar 文件(但不会解压 .zip)。
适用于需要自动解压或者拉取远程资源的场景

📌 示例

ADD example.tar.gz /app/
  • ADD 自动解压 example.tar.gz/app/
ADD https://example.com/sample.txt /app/sample.txt
  • ADD 会从 URL 下载 sample.txt 并存储到 /app/sample.txt

3. ADD vs COPY 选择

特性ADDCOPY
复制本地文件/目录
支持远程 URL 下载
自动解压 .tar 文件
适用于文件复制更推荐

📌 何时使用 COPY

  • 推荐使用 COPY,因为它更简单、明确,避免 ADD 可能带来的副作用(如意外解压)。

📌 何时使用 ADD

  • 需要自动解压 .tar.gz 文件到指定目录时。
  • 需要从远程 URL 下载文件时(尽管更推荐 RUN wgetRUN curl)。

4. 最佳实践

  • 尽量使用 COPY,因为 ADD 的功能更复杂,可能会导致意外行为(如 .tar 自动解压)。
  • 如果需要解压 .tar,可以手动使用 RUN tar -xvf,避免 ADD 带来的不可控行为。
  • 如果需要下载远程文件,更推荐 RUN wgetRUN curl,而不是 ADD,这样可以提高 Docker 层的可复用性。

📌 推荐方式

# 推荐方式 1: 复制本地文件
COPY myfile.txt /app/# 推荐方式 2: 下载远程文件(避免用 ADD)
RUN wget -O /app/sample.txt https://example.com/sample.txt# 推荐方式 3: 解压 .tar 文件(避免用 ADD)
COPY example.tar.gz /app/
RUN tar -xzf /app/example.tar.gz -C /app/ && rm /app/example.tar.gz

总结

COPY 更推荐,因为它只做文件复制,避免 ADD 的额外功能带来意外行为。
ADD 适用于特殊场景,如自动解压 .tar.gz 或远程下载(但 RUN wget/curl 更灵活)。
Docker 官方推荐优先使用 COPY,除非 ADD 的特性确实有用。

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

相关文章

Python函数的递归调用

基本介绍 1、简单的说: 递归就是函数自己调用自己,每次调用时传入不同的值 2、递归有助于编程者解决复杂问题&#xff0c;同时可以让代码变得简洁 递归能解决什么问题&#xff1f; 1、各种数学问题如&#xff1a;皇后问题、汉诺塔、阶乘问题、迷宫问题等等 2、各种算法中也…

ETL与ELT核心技术解析:如何选择最优数据集成方案

在数字化转型浪潮中&#xff0c;数据集成作为企业数据战略的核心环节&#xff0c;ETL与ELT两种技术路径的抉择直接影响着数据处理效率。本文将通过谷云科技在数据集成领域的实践经验&#xff0c;深入解析两种模式的本质差异与应用场景。 技术原理全景解读 1. ETL数据集成流程…

STM32 内置的通讯协议

数据是以帧为单位发的 USART和UART的区别就是有没有同步功能 同步是两端设备有时钟连接&#xff0c;异步是没时钟连接&#xff0c;靠约定号的频率&#xff08;波特率&#xff09;接收发送数据 RTS和CTS是用来给外界发送已“可接收”或“可发送”信号的&#xff0c;一般用不到…

DeepSeek-R1本地化部署(Mac)

一、下载 Ollama 本地化部署需要用到 Ollama&#xff0c;它能支持很多大模型。官方网站&#xff1a;https://ollama.com/ 点击 Download 即可&#xff0c;支持macOS,Linux 和 Windows&#xff1b;我下载的是 mac 版本&#xff0c;要求macOS 11 Big Sur or later&#xff0c;Ol…

牛客python蓝桥杯11-32(自用)

11 import os import sysdef huiwen(str):length len(str)# if length 0:# return -1result []for i in range(length-1): # 0 - length-2for j in range(i2,length1):# 取出从索引 i 到 j-1 的子串s str[i:j]# 正序倒序if s s[::-1]:result.append(len(s))if result…

Nanobrowser:开源AI自动化神器 OpenAI Operator替代品

Nanobrowser介绍 Nanobrowser 是一款基于 AI 驱动的 Web 自动化开源工具&#xff0c;以 Chrome 扩展程序的形式运行&#xff0c;让用户只需利用自己的 LLM API 密钥便能轻松启动多代理工作流&#xff0c;成为 OpenAI Operator 的免费替代方案。它不仅支持灵活接入您喜欢的 LLM…

【Python】为什么要写__init__.py

文章目录 PackageA(__init__特性)应该往__init__.py里放什么东西&#xff1f;1、包的初始化2、管理包的公共接口3、包的信息 正常我们直接导入就可以执行&#xff0c;但是在package的时候&#xff0c;有一种__init__.py的特殊存在 引入moduleA.py&#xff0c;执行main.py&…

SQL--算术运算符

过滤信息&#xff1a;where SELECT * FROM employees where department_id90; where紧随from语句 算术运算符&#xff1a; 加法运算符&#xff08;&#xff09; 用于计算两个数值的和。 示例&#xff1a; SELECT 1001 FROM dual; /*结果为101*/ SELECT 100A FROM dual; /*…