Dockerfile 中的 COPY 与 ADD 区别

1、COPY命令

COPY命令用于将于Dockerfile所在目录中的文件在镜像构建阶段从宿主机拷贝到镜像中,对于文件而言可以直接将文件复制到镜像中,代码如下:

FROM frolvlad/alpine-java:jre8-slim
MAINTAINER oas.cloud
ARG JAR_FILE
COPY ${JAR_FILE} /usr/local/oas/
WORKDIR /usr/local/oas/

对于目录而言,该命令只复制目录中的内容而不包含目录自身,代码如下:

FROM frolvlad/alpine-java:jre8-slim
MAINTAINER oas.cloud
COPY nickdir .
WORKDIR /usr/local/oas/

2、ADD命令

ADD命令相对于COPY命令,可以解压缩文件并把它们添加到镜像中的功能,如果我们有一个压缩文件包,并且需要把这个压缩包中的文件添加到镜像中。需不需要先解开压缩包然后执行 COPY 命令呢?当然不需要!我们可以通过 ADD 命令一次搞定:

FROM frolvlad/alpine-java:jre8-slim
MAINTAINER oas.cloud
ADD nickdir.tar.gz .
WORKDIR /usr/local/oas/

同时ADD还可以从 url 拷贝文件到镜像中,但官方不推荐这样使用,官方建议我们当需要从远程复制文件时,最好使用 curl 或 wget 命令来代替 ADD 命令。原因是,当使用 ADD 命令时,会创建更多的镜像层,当然镜像的 size 也会更大,代码如下:

ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all

如果使用下面的命令,不仅镜像的层数减少,而且镜像中也不包含 big.tar.xz 文件,代码如下:

RUN mkdir -p /usr/src/things \
    && curl -SL http://example.com/big.tar.xz \
    | tar -xJC /usr/src/things \
    && make -C /usr/src/things all

所以ADD命令官方推荐只有在解压缩文件并把它们添加到镜像中时才需要。

你可能感兴趣的:(Dockerfile,Docker)