0
点赞
收藏
分享

微信扫一扫

Dockerfile命令详解之 COPY


 语法

COPY  [--chown=<user>:<group>] <src>... <dest>

Dockerfile命令详解之 COPY_Dockerfile

或者

COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

Dockerfile命令详解之 COPY_jar_02

<src>:相对路径,指的是相对于宿主机(这里指的是安装有Docker引擎的那台服务器)上构建目录的文件路径

<dest>:指的是容器内的路径,如果是相对路径,则是相对于WORKDIR的路径

注意:

        1、--chown选项只适用于构建liunx类型的容器,不适用于windows类型的容器,因为用户组和所有权的概念不能在liunx和windows之间做转换。

        2、第二种命令格式主要用于路径中包含空格的情况!

        3、<src>以相对路径指定文件,文件必须在当前上下文之内,不能使用COPY ../something  /something

举个例子:

        如果我们有一个Dockerfile放在/usr/local目录下,这时候,我们需要将/usr/local/app/hello.jar拷贝到容器WORKDIR下的build目录中,我们的Dockerfile可以这样写:

FROM openjdk:11
WORKDIR /app
COPY app/hello.jar build/

Dockerfile命令详解之 COPY_Dockerfile_03

        这里的app/hello.jar是写的宿主机的相对路径,表示的是相对于构建目录的路径。此时构建目录是/usr/local,所以<src>实际上的绝对路径就是:/usr/local/app/hello.jar

        这里的build/是写的容器内的相对路径,表示的是相对于WORKDIR的路径。此时WORKDIR的路径是/app,所以<dest>实际上的绝对路径就是:/app/build/

        COPY指令路径通配符用法

        COPY指令中也可以使用通配符,复制匹配到的文件。

        比如:我要将/usr/local/app下的所有jar文件复制到容器中的/app/build/目录下,我们可以这样写Dockerfile

FROM openjdk:11
WORKDIR /app
# 匹配以jar为后缀的文件
COPY app/*.jar build/

Dockerfile命令详解之 COPY_Dockerfile_04

        我们也可以通过?符号,匹配单个字符,比如使用指令 COPY boo?.txt  /app/build ,就可以复制Dockerfile当前文件夹下 book.txt , boom.txt等等符合规则的文件。

        注意:

        如果文件中含有特殊字符,比如[或者]这样的字符,我们需要按照Golang的规则进行通配符的转换。比如文件arr[0].text 就需要写成COPY arr[[]0].txt /app/build/

关于[--chown]可选项 

         我们使用COPY指令,UID和GUI默认为0,等同于 COPY --chown=0:0  a.file b.file,我们可以利用--chown指定文件的用户ID和组ID,也可以直接指定用户名和组名,比如以下几种写法都是正确的:

COPY --chown=55:mygroup files* /somedir/
COPY --chown=bin files* /somedir/
COPY --chown=1 files* /somedir/
COPY --chown=10:11 files* /somedir/

Dockerfile命令详解之 COPY_相对路径_05

        当然,如果你的容器中压根没有/etc/passwd,也没有/etc/group,那么--chown的指定会导致COPY指令的失败。

增强语义之 COPY --link

        COPY --link会将你复制的文件放在一个空目录中,并将此目录转换为一个独立的层,并链接到上一阶段的构建中。

        比如:

FROM alpine
COPY --link /usr/local/app/*.jar /app/build/

Dockerfile命令详解之 COPY_Dockerfile_06

   就相当于: 

FROM alpine


FROM scratch
COPY /usr/local/app/*.jar /app/build/

Dockerfile命令详解之 COPY_jar_07

并且将构建出来的两层合并到一起。      

         使用COPY --link将重用之前生成的构建并合并到新层之上。这也意味着,当基本映像收到更新时,您可以轻松地重新设置映像的基础,而不必再次执行整个构建!!

        一般来说推荐使用COPY --link,以提供更好的构建体验。


举报

相关推荐

0 条评论