知方号

知方号

Dockerfile 指令 COPY 拷贝文件夹

今天在编写 dockerfile 时使用 COPY 拷贝文件夹时遇到了意料之外的情况。在此记录一下正确的使用方法。

背景说明

今天在通过 dockerfile 将文件夹拷贝到镜像的时候发现,是把文件夹下的内容拷贝进去了。

dockerfile 如下:

12345FROM node:alpineWORKDIR /usr/src/appCOPY dist node_modules package.json ./EXPOSE 3000CMD ["yarn", "start:prod"]

我是想把 dist 和 node_modules 两个文件夹都拷贝到镜像中,又不想用多条 COPY 来分别拷贝,那样会多一个 layer。结果发现 dist 和 node_modules 两个文件夹本身没有被拷贝进镜像,而是把文件夹下的内容分别拷贝进的镜像。

经过测试发现:

ADD 命令和 COPY 命令在复制文件时行为一致COPY/ADD 命令的源如果是文件夹,复制的是文件夹的内容而不是其本身使用 * 匹配所有文件,如果遇到文件夹也会保持上述逻辑,即仅复制内容

这个逻辑很诡异,和我们的一般预期不符。

我发现在六年前就已经有人问过类似的问题了,看来也没啥要改的意思。

实现方法

下面列举几个事项方式,大家可以参考着使用。

单个文件夹复制,指定目标目录

一种方法就是一次复制一个文件夹,然后 COPY 的时候要指定到镜像中的具体目录,比如把上面的 dockerfile 改成这样:

1234567FROM node:alpineWORKDIR /usr/src/appCOPY dist ./distCOPY node_modules ./node_modulesCOPY package.json ./EXPOSE 3000CMD ["yarn", "start:prod"] 放到另一个文件夹中统一复制

上面那种写法很麻烦,还会增加 layer 数。这边想了一个变相的方法,不是很优雅。

就是将需要拷贝的文件夹都放到一个统一的文件夹中,然后在 dockerfile 中拷贝这个文件夹,文件夹下的目录结构就能够得到保持。

1mkdir dockerPackages && mv dist node_modules dockerPackages12345FROM node:alpineWORKDIR /usr/src/appCOPY dockerPackages package.json ./EXPOSE 3000CMD ["yarn", "start:prod"] 利用 .dockerignore 文件

我们上面的写法其实就是像完成一件事,那就是仅把部分内容拷贝进镜像,然后忽略其他内容。这样,我们就可以利用 .dockerignore 文件,来更加优雅地实现。先忽略所有文件,然后将我们需要拷贝的文件排除。

.dockerignore:

1234*!dist!node_modules!package.json123456FROM node:alpineWORKDIR /usr/src/appCOPY . ./EXPOSE 3000CMD ["yarn", "start:prod"]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。

上一篇 没有了

下一篇没有了