Dockerfile命令详解之 COPY

              许多同学不知道Dockerfile应该如何写,不清楚Dockerfile中的指令分别有什么意义,能达到什么样的目的,接下来我将在容器化专栏中详细的为大家解释每一个指令的含义以及用法。

        专栏订阅传送门https://blog.csdn.net/qq_38220908/category_11989778.html

       指令不区分大小写 gif.latex?%5E%7B%5E%7B%5B1%5D%7D%7D。但是,按照惯例,它们应该是大写的,以便更容易地将它们与参数区分开来。(引用至官方文档>>>)

使用Dockerfile构建Springboot项目

Docker官方文档 - COPY

Dockerfile命令详解之 FROM

Dockerfile命令详解之 ARG


 语法

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

或者

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

<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/

        这里的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/

        我们也可以通过?符号,匹配单个字符,比如使用指令 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/

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

增强语义之 COPY --link

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

        比如:

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

   就相当于: 

FROM alpine


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

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

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

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

 

 

[1]  感谢大佬 @kenllf 的斧正

 

 

 

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值