COPY 指令

COPY 有两种形式:

COPY <src>... <dest>
COPY ["<src>",... "<dest>"] (this form is required for paths containing whitespace)

COPY 指令从 <src> 复制新文件或目录,并将它们添加到路径 <dest> 的容器的文件系统中。

可以指定多个 <src> 资源,但它们必须相对于正在构建的源目录(构建的上下文)。

每个 <src> 可能包含通配符,匹配将使用 Go 的 filepath.Match 规则完成。例如:

COPY hom* /mydir/        # adds all files starting with "hom"
COPY hom?.txt /mydir/    # ? is replaced with any single character, e.g., "home.txt"

<dest> 是绝对路径,或相对于 WORKDIR 的路径,源将被复制到目标容器中。

COPY test relativeDir/   # adds "test" to `WORKDIR`/relativeDir/
COPY test /absoluteDir/  # adds "test" to /absoluteDir/

使用 UID 和 GID 为 0 创建所有新文件和目录。

注意:如果使用 stdin(docker build - < somefile)构建,则没有构建上下文,因此无法使用 COPY

COPY 遵守以下规则:

  • <src> 路径必须位于构建的上下文中; 你不能知道 14 ../something / something,因为 docker 构建的第一步是将上下文目录(和子目录)发送到 docker 守护进程。

  • 如果 <src> 是目录,则复制目录的全部内容,包括文件系统元数据。注意:不复制目录本身,只复制其内容。

  • 如果 <src> 是任何其他类型的文件,它将与其元数据一起单独复制。在这种情况下,如果 <dest> 以尾部斜杠/结束,则它将被视为目录,<src> 的内容将在 <dest>/base(<src>) 中写入。

  • 如果直接或由于使用通配符指定了多个 <src> 资源,则 <dest> 必须是目录,并且必须以斜杠/结尾。

  • 如果 <dest> 没有以斜杠结尾,则它将被视为常规文件,<src> 的内容将在 <dest> 中写入。

  • 如果 <dest> 不存在,则会在其路径中创建所有缺少的目录。