Dockerfile中的COPY和ADD命令有什么区别?我什么时候可以使用其中一个命令而不是另一个命令?
COPY <src> <dest>
COPY指令将从<src>复制新文件,并将它们添加到路径<dest>的容器文件系统中
ADD <src> <dest>
ADD指令将从<src>复制新文件,并将它们添加到路径<dest>的容器文件系统中。
Dockerfile中的COPY和ADD命令有什么区别?我什么时候可以使用其中一个命令而不是另一个命令?
COPY <src> <dest>
COPY指令将从<src>复制新文件,并将它们添加到路径<dest>的容器文件系统中
ADD <src> <dest>
ADD指令将从<src>复制新文件,并将它们添加到路径<dest>的容器文件系统中。
当前回答
如果您有foo.tar.gz文件,请比较以下命令。ADD命令创建的层比COPY命令少,并且在推送docker图像时节省了大量的网络流量。
ADD foo.tar.gz /
COPY foo.tar.gz /
RUN tar -zxvf foo.tar.gz
RUN rm -rf foo.tar.gz
其他回答
docker build -t {image name} -v {host directory}:{temp build directory} .
这是将文件复制到图像中的另一种方法。-v选项临时创建一个在构建过程中使用的卷。
这与其他卷不同,因为它仅为生成装载主机目录。可以使用标准cp命令复制文件。
此外,像curl和wget一样,它可以在命令堆栈中运行(在单个容器中运行),而不必乘以图像大小。ADD和COPY不可堆叠,因为它们在独立的容器中运行,并且在其他容器中执行的文件上的后续命令将使图像大小倍增:
通过这样设置选项:
-v /opt/mysql-staging:/tvol
以下内容将在一个容器中执行:
RUN cp -r /tvol/mysql-5.7.15-linux-glibc2.5-x86_64 /u1 && \
mv /u1/mysql-5.7.15-linux-glibc2.5-x86_64 /u1/mysql && \
mkdir /u1/mysql/mysql-files && \
mkdir /u1/mysql/innodb && \
mkdir /u1/mysql/innodb/libdata && \
mkdir /u1/mysql/innodb/innologs && \
mkdir /u1/mysql/tmp && \
chmod 750 /u1/mysql/mysql-files && \
chown -R mysql /u1/mysql && \
chgrp -R mysql /u1/mysql
从Docker文档:
添加或复制虽然ADD和COPY功能相似,但一般来说,COPY是首选。这是因为它比ADD更透明。COPY仅支持将本地文件基本复制到容器中,而ADD具有一些不明显的功能(如仅本地的tar提取和远程URL支持)。因此,ADD的最佳用途是将本地tar文件自动提取到图像中,如ADD rootfs.tar.xz/中所示。
更多:编写Dockerfile的最佳实践
ADD和COPY都具有将文件和目录从源复制到目标的相同功能,但ADD具有额外的文件提取和URL文件提取功能。最佳做法是仅在复制操作中使用COPY,避免在许多领域使用ADD。该链接将通过一些简单的示例解释dockerfile中COPY和ADD之间的区别
由于Docker 17.05 COPY在多阶段构建中与--from标志一起使用,所以可以将工件从先前的构建阶段复制到当前的构建阶段。
从文档中
可选地,COPY接受一个标志--from=<name|index>,该标志可用于将源位置设置为将使用的前一个生成阶段(使用from..AS创建),而不是用户发送的生成上下文。
如果要将xx.tar.gz添加到/usr/local-in容器中,请解压缩它,然后删除无用的压缩包。
副本:
COPY resources/jdk-7u79-linux-x64.tar.gz /tmp/
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local
RUN rm /tmp/jdk-7u79-linux-x64.tar.gz
对于ADD:
ADD resources/jdk-7u79-linux-x64.tar.gz /usr/local/
ADD仅支持本地焦油提取。除此之外,COPY将使用三层,但ADD仅使用一层。