如何在Dockerfile中使用复制与添加命令

介绍

如何在Dockerfile中使用复制与添加命令?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强>构建上下文的概念

在使用码头工人建造命令通过Dockerfile创建镜像时,会产生一个构建上下文(上下文)。所谓的构建上下文就是码头工人建造命令或URL的路径指定的路径中的文件的集合。在镜像构建过程中可以引用上下文中的任何文件,比如我们要介绍的复制和添加命令,就可以引用上下文中的文件。

默认情况下<代码>码头工人建造- t testx>

<代码>码头工人建立美元- t testx/home/nick/hc

我们指定/home/nick/hc目录为构建上下文,默认情况下码头工人会使用在上下文的根目录下找到的Dockerfile文件。

复制和添加命令不能拷贝上下文之外的本地文件

对于复制和添加命令来说,如果要把本地的文件拷贝到镜像中,那么本地的文件必须是在上下文目录中的文件。其实这一点很好解释,因为在执行构建命令时,码头工人客户端会把上下文中的所有文件发送给码头工人守护进程。考虑码头工人客户端和码头工人守护进程不在同一台机器上的情况,构建命令只能从上下文中获取文件。如果我们在Dockerfile的复制和添加命令中引用了上下文中没有的文件,就会收到类似下面的错误:

如何在Dockerfile中使用复制与添加命令

<强>与WORKDIR协同工作

WORKDIR命令为后续的运行CMD,复制、添加等命令配置工作目录。在设置了WORKDIR命令后,接下来的复制和添加命令中的相对路径就是相对于WORKDIR指定的路径。比如我们在Dockerfile中添加下面的命令:

<代码> WORKDIR/应用
checkredis副本。py。

然后构建名称为testx的容器镜像,并运行一个容器查看文件路径:

如何在Dockerfile中使用复制与添加命令

checkredis。py文件就是被复制到了WORKDIR/app目录下。

<强>复制命令的简单性

如果仅仅是把本地的文件拷贝到容器镜像中,本命令是最合适不过的。其命令的格式为:
复制& lt; src>& lt; dest>

除了指定完整的文件名外,本命令还支持去风格的通配符,比如:

<代码>复制检查*/testdir/,,,,,,,,,,#拷贝所有检查开头的文件
复制支票吗?。日志/testdir/,,,,,,#吗?是单个字符的占位符,比如匹配文件check1。日志代码

对于目录而言,复制和添加命令具有相同的特点:只复制目录中的内容而不包含目录自身。比如我们在Dockerfile中添加下面的命令:

<代码> WORKDIR/应用
复制nickdir。

其中nickdir目录的结构如下:

如何在Dockerfile中使用复制与添加命令

重新构建镜像testx,运行一个容器并查看/app目录下的内容:

如何在Dockerfile中使用复制与添加命令

这里只有file1和file2少了一层目录nickdir。如果想让file1和file2还保存在nickdir目录中,需要在目标路径中指定这个目录的名称,比如:

<代码> WORKDIR/应用
复制nickdir。/nickdir

复制命令区别于添加命令的一个用法是在多级场景下。关于多级的介绍和用法请参考笔者的《Dockerfile中的多级》一文。在多级的用法中,可以使用本命令把前一阶段构建的产物拷贝到另一个镜像中,比如:

从golang: 1.7.3
WORKDIR/去/src/github.com/sparkdevo/href-counter/
跑去- d - v golang.org/x/net/html
app.go 复印件;,,。
运行linux CGO_ENABLED=0美好=去构建——-installsuffix cgo - o应用。从高山
:
运行最新的apk, no - cache添加ca证书
WORKDIR/root/
复制——从=0/去/src/github.com/sparkdevo/href-counter/app。
CMD (“。/app")

这段代码引用自《Dockerfile中的多级》一文,其中的本命令通过指定——从=0参数,把前一阶段构建的产物拷贝到了当前的镜像中。

<强>添加命令还可以干其它事情

添加命令的格式和本命令相同,也是:

<代码>添加& lt; src>& lt; dest>

如何在Dockerfile中使用复制与添加命令